我试图让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 />

评论

LocalCommand在本地系统而不是远程系统上运行。

参见此处superuser.com/a/124110/47962

#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。 />