ssh
在登录时自动切换到特定目录。我试图使用~/.ssh/config
中的以下指令来使该行为正常运行:Host example.net
LocalCommand "cd web"
但是,每当我登录时,都会看到以下内容:
/bin/bash: cd web: No such file or directory
尽管我的主目录中肯定有一个
web
文件夹。即使使用绝对路径也会给出相同的消息。要明确的是,如果我在登录后键入cd web
,则会找到正确的文件夹。我在这里缺少什么?引号/绝对路径的不同组合会给出不同的错误消息:
LocalCommand "cd web"
/bin/bash: cd web: No such file or directory
LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory
LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error
这使我认为引号不应存在,并且还会发生另一个错误。 br />
#1 楼
cd是内置的shell。 LocalCommand执行为:/bin/sh -c <localcommand>
您要执行的操作实际上无法通过SSH来完成;您需要以某种方式修改外壳,例如通过bashrc / bash_profile。
<编辑将近十年...>
LocalCommand
无论如何都不是您想要的。那是在您的机器上运行。您要RemoteCommand
。这样的事情对我有用: Host example.net
RemoteCommand cd / && exec bash --login
RequestTTY yes
评论
是的,只想提一提。您可以将cd命令放在远程服务器的〜/ .bashrc中。
–vdboor
2010年8月5日16:00
真烦人正如我在另一条评论中提到的那样,服务器具有许多主机名,并且我希望基于所使用的主机名具有不同的行为。我想不可能确定从.bashrc中使用了哪个?
–加雷斯
2010年8月5日在16:15
有可能,只是不建议这样做。例如,用一个小的shell脚本或别名替换ssh,该脚本或别名将主机名作为要导出的变量传递(例如“ ssh -t user @ host'export connhostname = host; bash --login'”)。但实际上,您已经开始进入非常陌生的领域。也许更好的问题是,为什么要这种行为?
– BMDan
2010年8月5日17:50
老实说,这并不是一件大事。我只是在这种情况下,大部分时间我登录到该服务器时都会直接进入两个目录之一(取决于我所使用的主机)
–加雷斯
10年8月6日在7:32
#2 楼
这适用于:ssh server -t "cd /my/remote/directory; bash --login"
如果目录不存在,则创建目录:
ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"
如果不要在路径末尾添加
bash
,然后在cd
命令运行后退出。而且,如果您不添加--login
,则您的~/.profile
不会被采购。评论
这将使我到达正确的位置,并显示bash提示。完善!
– Peter Ehrlich
2012年7月13日在21:06
这对我也适用,但是如果我尝试将它与ssh jump-host一起使用,则无法使用。我收到连接关闭消息。
–里卡多
2015年11月4日在10:29
#3 楼
登录到框
编辑
~/.bash_profile
在文件末尾添加
cd /path/to/your/destination
保存并退出
从框注销
登录再次,您应该登陆
/path/to/your/destination
评论
在某些机器上,您可能需要将cd / path / to / your / destination附加到〜/ .bashrc而不是〜/ .bash_profile。结果应该是相同的。
–马特西亚
16年2月2日,11:11
这非常有效,谢谢-是仅限于我的用户ID,还是会影响其他用户的登录信息?
– hard_working_ant
17年4月26日在3:53
@BabyGroot如果您修改〜/ .bash_profile或〜/ .bashrc,它将仅影响当前用户。
–rubenvarela
18 Mar 15 '18 at 13:27
我注意到我必须使用.bashrc,但除此之外,它还很棒!
–membersound
20年7月8日在8:25
#4 楼
针对需要ssh并覆盖默认.bashrc文件的情况,提供了更强大的解决方案。这在远程服务器环境具有多个docroot且被多个用户使用的情况下非常有用。alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'
更详细:
第一个命令在远程服务器上的
.bashrc_tmp
目录中创建/tmp
文件,内容为cd /path/to/dir
下一个命令使用步骤1中指定的配置文件执行
bash
。这允许切换到所需的目录并取消默认的.bashrc
。 />整个命令被包装为alias
,因此在ssh client命令提示符下,可以将其称为ssh_myserver
评论
创意...只要您将烫发写入/ tmp
–smci
17年11月2日在21:24
#5 楼
因此,我搜索了很多网站(stackoverflow,此网站),但没有找到我想要的。我最终创建了自己的shell脚本。我在这里粘贴。您也可以将其复制到$ PATH中的目录中。#!/bin/bash
ssh -t <username@hostname> "cd ~/; exec $SHELL --login"
在此之后。我可以:
connect <foldername>
注意:更改路径变量后,您可能需要注销并重新登录
评论
我比以前的建议更喜欢它,因为“ $ SHELL”始终有效,而“ bash”则无效。同样,使用“ exec”也很不错。
–戴夫
17年8月16日在2:24
进一步的改进将确保'cd'成功-“ cd〜/ $ 1 && exec ...”
–戴夫
17年8月16日在2:27
#6 楼
您是否在ssh配置中启用了此指令? />或者,您是否尝试过将命令添加到您的no
文件中?评论
设置了该指令,是的(如果没有的话,我想我不会看到显示的错误消息)。使用.bashrc的问题是服务器具有不同的主机名,我希望将不同的主机名转换为不同的起始目录
–加雷斯
2010年8月5日下午14:57
除非每个主机名都有不同的IP地址,否则服务器将无法知道您请求的主机名。虽然HTTP请求提供了友好的Host:标头来标识请求的主机名,但SSH连接却没有。
–莫斯科
2010年8月5日,19:42
#7 楼
在您的~/.ssh/config
中:LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd
在您的
~/.bashrc
结尾:if [[ -f $HOME/.ssh/ssh_cd ]]
then
cd $(<$HOME/.ssh/ssh_cd)
# uncomment the line below and the file will be removed so the cd won't work
# unless the file is regenerated since you may not want this to operate for
# non-ssh logins or for ssh logins that you want to function differently
# rm $HOME/.ssh/ssh_cd
fi
我尝试使用变量传递,包括带有导出的变量,但这些命令在不同的Shell中运行。
在测试您要执行的操作时,使用未引用的绝对路径时,我没有收到错误,方式。我在命令末尾添加了
; pwd
,并显示了正确的目录,但是我最终进入的目录是~
。我的外壳启动文件中没有cd
命令。我尝试在cd somedir; pwd
中放置另一个~/.ssh/rc
(另一个仍然放置)。在发出motd之前执行config
命令,然后在发出Shell启动文件之前,先发出rc
命令。再一次,它发生在不同的外壳中。尝试按文件传递技术,让我知道它是否对您有用。
#8 楼
您是否尝试过不带引号的内容?我见过的唯一示例没有它们,因此与它们一起尝试将cd \ web作为命令执行。评论
好的,删除引号似乎有帮助,但我仍然有错误(请参见编辑后的帖子)
–加雷斯
2010年8月5日在15:15
#9 楼
您也可以尝试使用-t
选项:ssh server -t "cd /my/remote/directory; bash"
#10 楼
尝试改用RemoteCommand
,例如Host myhost
HostName IP
User ubuntu
IdentityFile ~/.ssh/id_rsa
RemoteCommand cd web; $SHELL -il
RemoteCommand
:指定成功连接到服务器后在远程计算机上执行的命令。 (man ssh_config
)#11 楼
也许您需要创建~/.bash_profile
,尽管您已经有一个~/.bashrc
。在我的
debian
系统上,使用~/.bashrc
登录后未执行sshpass
。 />
评论
LocalCommand在本地系统而不是远程系统上运行。参见此处superuser.com/a/124110/47962