题 如何在ssh登录时自动更改目录?


我想要 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

这让我觉得引号不应该存在,而且还有另一个错误发生。


77
2017-08-05 14:40




LocalCommand在本地系统上运行,而不是在远程系统上运行。 - Steve Kehlet
看这里 superuser.com/a/124110/47962 - Nakilon


答案:


cd是内置的shell。 LocalCommand执行如下:

/bin/sh -c <localcommand>

您要做的事情无法通过SSH实现;你需要以某种方式修改shell,例如通过bashrc / bash_profile。


18
2017-08-05 15:52



是的,只想提一下。你可以把 cd 命令输入 ~/.bashrc 而是在远程服务器上。 - vdboor
那很烦人。正如我在另一条评论中提到的那样,服务器有许多主机名,我希望根据使用的主机名有不同的行为。我想不可能确定从.bashrc使用哪个? - Gareth
这可能,可能不太可取。比如用一个小的shell脚本替换ssh或将主机名作为要导出的变量传递的别名(la“ssh -t user @ host'export connhostname = host; bash --login'”)。但事实上,你开始进入一个非常奇怪的领域。或许更好的问题是,为什么你想要这种行为? - BMDan
说实话,这并不是什么大不了的事。我只是在我登录到这个服务器的绝大部分时间我直接进入两个目录之一(取决于我正在使用的主机) - Gareth


这有效:

ssh server -t "cd /my/remote/directory; bash --login"

如果目录不存在,则创建目录:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

如果你不添加 bash 到路径的尽头然后你退出 cd 命令运行。如果你不添加 --login 然后你的 ~/.profile 不是来源。


76
2017-12-21 21:29



这样就可以在bash提示符下找到正确的位置。完善! - Peter Ehrlich
这也适用于我,但如果我尝试使用它与ssh jump-host它不起作用。我收到连接已关闭的消息。 - Riccardo


  1. 登录到您的盒子
  2. 编辑 ~/.bash_profile 
  3. 在文件末尾添加 cd /path/to/your/destination
  4. 保存并退出编辑器
  5. 从框中退出
  6. 再次登录,你应该登陆 /path/to/your/destination

39
2018-02-27 11:04



在某些机器上,您可能需要附加 cd /path/to/your/destination 至 ~/.bashrc 而不是 ~/.bash_profile。结果应该是一样的。 - Matthias
这非常感谢 - 它仅限于我的用户ID还是会影响其他用户登录? - barry_allen
如果你修改@BabyGroot ~/.bash_profile 要么 ~/.bashrc 它只会影响当前用户。 - rubenvarela


当您需要ssh并覆盖默认的.bashrc文件时,更强大的解决方案。当远程服务器环境具有多个docroots并由多个用户使用时,这非常有用。

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

更详细:

  1. 第一个命令创建 .bashrc_tmp 档案 /tmp 具有内容的远程服务器上的目录 cd /path/to/dir
  2. 下一个命令执行 bash 使用步骤1中指定的配置文件。这允许切换到所需的目录并禁止默认 .bashrc
  3. 整个命令被包装为 alias,所以在ssh客户端命令提示符下可以调用它 ssh_myserver

5
2017-08-21 11:53



创意...只要你有/ tmp的写权限 - smci


你在ssh配置中启用了这个指令吗?

PermitLocalCommand yes

默认为 no,在这种情况下你的 LocalCommand 指令将被忽略。

或者,您是否尝试将命令添加到您的 .bashrc 文件?


4
2017-08-05 14:47



该指令已设置,是(我假设如果不是,我将看不到显示的错误消息)。使用.bashrc的问题是服务器有不同的主机名,我想将不同的主机名转换为不同的起始目录 - Gareth
除非每个主机名具有不同的IP地址,否则服务器无法知道您请求的主机名。虽然HTTP请求提供了友好的Host:标头来标识所请求的主机名,但SSH连接却没有。 - Fosco


所以我搜索了很多网站(stackoverflow,这个),但没找到我想要的。我最终创建了自己的shell脚本。我在这里粘贴它。您也可以将它复制到$ PATH中的目录。

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

所以在此之后。我做:

connect <foldername>

注意:更改路径变量后,您可能需要注销并再次登录


4
2017-11-25 03:10



我更喜欢这个以前的建议,因为'$ SHELL'总是有效的,而'bash'可能不是。使用'exec'也很不错。 - Dave
进一步改进将确保'cd'成功 - “cd~ / $ 1 && exec ......” - Dave


在你的 ~/.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 我的shell启动文件中的命令。我尝试了另外一个 cd somedir; pwd~/.ssh/rc (另一个仍然存在)。该 config 命令在motd发出之前执行 rc 命令是在之后发出的,但是在shell启动文件来源之前。所以,它又发生在一个不同的shell中。

尝试传递文件技术,让我知道它是否适合您。


3
2017-08-05 18:21





你试过它而没有引号吗?我见过的唯一例子没有它们,因此可能会尝试执行cd \ web作为命令。


2
2017-08-05 15:03



好的,删除引号似乎有帮助,但我仍然有错误(参见编辑后的帖子) - Gareth


您也可以尝试使用该选项 -t

ssh server -t "cd /my/remote/directory; bash"

0
2017-09-21 09:03