如何直接ssh到特定目录?

Fro*_*sty 220 ssh bash shell scripting

我经常需要登录到几台服务器中的一台并转到这些机器上的几个目录中的一个.目前我做了这样的事情:

localhost ~]$ ssh somehost

Welcome to somehost!

somehost ~]$ cd /some/directory/somewhere/named/Foo
somehost Foo]$ 

我有脚本可以确定我需要进入哪个主机和哪个目录,但我无法找到一种方法来做到这一点:

localhost ~]$ go_to_dir Foo

Welcome to somehost!

somehost Foo]$

有一个简单,聪明或任何方式来做到这一点?

rog*_*pvl 383

您可以执行以下操作:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"
Run Code Online (Sandbox Code Playgroud)

这样,您将在directory_wanted上获得一个shell.


说明

-t强制伪终端分配.这可以用于在远程机器上执行任意基于屏幕的程序,这可以是非常有用的,例如在实现菜单服务时.

-t即使ssh没有本地tty,多个选项也会强制tty分配.

  • 如果您不使用,-t则不会出现提示.
  • 如果不添加,; bash则连接将关闭并将控制权返回给本地计算机

  • 你通常需要一个登录shell:`ssh -t example.com"cd/foo/bar; exec\$ SHELL -l"` (37认同)
  • 在我的情况下 - 缺少的部分 (20认同)
  • 我必须这样做:`ssh -t xxx.xxx.xxx.xxx"cd/directory_wanted && exec\$ SHELL"` (8认同)
  • 只是想链接[在ssh登录时自动更改目录 - 服务器故障](http://serverfault.com/a/215051); 从那里粘贴这个命令(这是@christianbundy的版本):`ssh server -t"cd/my/remote/directory; bash --login"` (8认同)
  • 使用这种方法时,没有读取.bash_profile,有谁知道为什么? (2认同)

Chr*_*utz 49

你可以添加

cd /some/directory/somewhere/named/Foo
Run Code Online (Sandbox Code Playgroud)

到另一台主机上的.bashrc文件(或.profile其他任何名称).这样,无论你做什么或ssh来自哪里,每当你登录到那台服务器时,它都会cd到你正确的目录,而你所要做的就是ssh正常使用.

诅咒,rogeriopvl的解决方案也有效,但它有点冗长,你必须记住每次都这样做(除非你做一个别名)所以它看起来有点"有趣".

  • +1,如果您需要恒定目录而不是使 ssh 命令更长时间记住每次连接到 X 机器时要移动到哪个目录,这看起来更合适 (3认同)

chr*_*ndy 20

我已经连续创建了一个SSH和CD到服务器的工具 - 恰当地命名为sshcd.对于您给出的示例,您只需使用:

sshcd somehost:/some/directory/somewhere/named/Foo
Run Code Online (Sandbox Code Playgroud)

如果您有任何疑问或问题,请告诉我!


Bas*_*ers 12

基于对@ rogeriopvl的回答的补充,我建议如下:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"
Run Code Online (Sandbox Code Playgroud)

链接命令&&将使下一个命令仅在前一个命令成功时运行(而不是使用;,它按顺序执行命令).当需要cd执行命令的目录时,这尤其有用.

想象一下做以下事情:

/home/me$ cd /usr/share/teminal; rm -R *
Run Code Online (Sandbox Code Playgroud)

该目录teminal不存在,这会导致您保留在主目录中并使用以下命令删除其中的所有文件.

如果您使用&&:

/home/me$ cd /usr/share/teminal && rm -R *
Run Code Online (Sandbox Code Playgroud)

找不到目录后,该命令将失败.


Dre*_*rew 10

我的首选方法是使用SSH配置文件(如下所述),但是根据您的使用情况,有几种可能的解决方案。

命令行参数

我认为此方法的最佳答案是christianbundy对已接受答案的答复:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
Run Code Online (Sandbox Code Playgroud)

使用双引号将允许您使用本地计算机中的变量,除非将它们转义(如此$SHELL处所示)。或者,您可以使用单引号,并且所有使用的变量都是目标计算机上的变量:

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'
Run Code Online (Sandbox Code Playgroud)

重击功能

您可以通过将命令包装在bash函数中来简化该命令。假设您只想输入以下内容:

sshcd example.com /foo/bar
Run Code Online (Sandbox Code Playgroud)

您可以通过将其添加到您的服务器中来使其工作~/.bashrc

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }
Run Code Online (Sandbox Code Playgroud)

如果您使用远程计算机上存在的目录变量,请确保对其进行转义或将其置于单引号中。例如,将其cd到存储在JBOSS_HOME远程计算机上的变量中的目录:

sshcd example.com \$JBOSS_HOME
Run Code Online (Sandbox Code Playgroud)

SSH配置文件

如果您希望始终使用普通的ssh命令针对特定(或任何)主机查看此行为,而不必使用额外的命令行参数,则可以在ssh配置文件中设置RequestTTYRemoteCommand选项。

例如,我只想输入以下命令:

ssh qaapps18
Run Code Online (Sandbox Code Playgroud)

但希望它始终像以下命令一样运行:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'
Run Code Online (Sandbox Code Playgroud)

所以我将其添加到我的~/.ssh/config文件中:

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL
Run Code Online (Sandbox Code Playgroud)

现在,此规则适用于主机名中带有“ apps”的任何主机。

有关更多信息,请参见http://man7.org/linux/man-pages/man5/ssh_config.5.html

  • `RequestTTY` 结合 `RemoteCommand` 正是我所需要的,谢谢。 (2认同)