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


87

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

这使我认为引号不应存在,并且发生了另一个错误。


9
LocalCommand在本地系统而不是远程系统上运行。
史蒂夫·凯莱特

Answers:


25

cd是内置的shell。LocalCommand执行为:

/bin/sh -c <localcommand>

您要执行的操作实际上无法通过SSH来完成;您需要以某种方式修改外壳,例如通过bashrc / bash_profile。

<将近十年后编辑...>

LocalCommand反正不是你想要的 那是在您的机器上运行。你要RemoteCommand。这样的事情对我有用:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
是的,只想提一提。您可以将cd命令放在~/.bashrc远程服务器上。
vdboor 2010年

真烦人 正如我在另一条评论中提到的那样,服务器具有许多主机名,并且我希望基于所使用的主机名具有不同的行为。我想不可能确定从.bashrc中使用了哪个?
加雷斯

有可能,只是不建议这样做。例如,用一个小的shell脚本或别名替换ssh,该脚本或别名将主机名作为要导出的变量进行传递(例如“ ssh -t user @ host'export connhostname = host; bash --login'”)。但实际上,您已经开始进入非常陌生的领域。也许更好的问题是,为什么要这种行为?
BMDan

老实说,这并不是一件大事。我只是在这种情况下,大部分时间我登录到该服务器时都会直接转到两个目录之一(取决于我使用的主机)
Gareth 2010年

77

这有效:

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提示。完善!
彼得·埃里希

这对我也适用,但是如果我尝试将它与ssh jump-host一起使用,则无法使用。我收到连接关闭消息。
Riccardo

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

3
在某些机器上,你可能需要需要追加cd /path/to/your/destination~/.bashrc而不是到~/.bash_profile。结果应该是相同的。
马赛厄斯

这非常有效,谢谢-是仅限于我的用户ID,还是会影响其他用户的登录信息?
hard_working_ant 17-4-26的

@BabyGroot如果修改~/.bash_profile或者~/.bashrc它只会影响当前用户。
rubenvarela

5

当您需要ssh并覆盖默认的.bashrc文件时,这种解决方案更为可靠。这在远程服务器环境具有多个docroot并且被多个用户使用的情况下很有用。

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中指定的配置文件执行next命令。这允许切换到所需的目录并取消显示default .bashrc
  3. 整个命令都包装为alias,因此在ssh client命令提示符下,可以将其称为ssh_myserver

创意...只要您向/ tmp写烫发
smci

4

您是否在ssh配置中启用了此指令?

PermitLocalCommand yes

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

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


设置了该指令,是的(如果没有的话,我想我不会看到显示的错误消息)。使用.bashrc的问题在于服务器具有不同的主机名,我希望将不同的主机名转换为不同的起始目录
Gareth,2010年

除非每个主机名都有不同的IP地址,否则服务器将无法知道您请求的主机名。HTTP请求提供了友好的Host:标头来标识请求的主机名,而SSH连接却没有。
Fosco 2010年

4

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

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

所以之后。我做:

connect <foldername>

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


我更喜欢此建议,因为“ $ SHELL”始终有效,而“ bash”可能无效。同样,使用“ exec”也很不错。
戴夫

进一步的改进将确保'cd'成功-“ cd〜/ $ 1 && exec ...”
Dave

3

在您的~/.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发出之前执行该命令,然后在发出rcshell启动文件之前发出该命令。同样,它发生在不同的外壳中。

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


2

您是否尝试过不带引号的内容?我见过的仅有的示例没有它们,因此与它们一起尝试将cd \ web作为命令执行。


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

1

您也可以尝试以下方法,方法是-t

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

1

尝试RemoteCommand改为使用,例如

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand:指定成功连接到服务器后要在远程计算机上执行的命令。(man ssh_config

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.