我经常必须登录到几个服务器中的一个,然后进入这些机器上的几个目录中的一个。目前我做的事情是这样的:

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]$

有没有简单、聪明或任何方法可以做到这一点?


当前回答

根据@rogeriopvl的回答,我建议如下:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

使用&&链接命令将使下一个命令只在前一个命令成功时运行(与使用;相反,它按顺序执行命令)。当需要cd到执行该命令的目录时,这特别有用。

想象一下这样做:

/home/me$ cd /usr/share/teminal; rm -R *

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

如果你使用&&:

/home/me$ cd /usr/share/teminal && rm -R *

如果找不到目录,该命令将失败。

其他回答

用-t思想更进一步。我保留了一组脚本,调用下面的脚本访问我经常访问的主机中的特定位置。我将它们都保存在~/bin中,并将该目录保存在我的路径中。

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"

我知道这个问题很久以前就有答案了,但我在尝试将ssh登录合并到bash脚本中时发现了这个问题,登录后运行几个命令,然后注销并继续使用bash脚本。我发现的最简单的方法,在其他地方没有提到,因为它是如此琐碎,就是这样做。

#!/bin/bash

sshpass -p "password" ssh user@server 'cd /path/to/dir;somecommand;someothercommand;exit;'

根据@rogeriopvl的回答,我建议如下:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

使用&&链接命令将使下一个命令只在前一个命令成功时运行(与使用;相反,它按顺序执行命令)。当需要cd到执行该命令的目录时,这特别有用。

想象一下这样做:

/home/me$ cd /usr/share/teminal; rm -R *

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

如果你使用&&:

/home/me$ cd /usr/share/teminal && rm -R *

如果找不到目录,该命令将失败。

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

命令行参数

我认为这种方法的最佳答案是christianbundy对公认答案的回答:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

使用双引号将允许您使用本地机器中的变量,除非它们被转义(如此处的$SHELL)。或者,你可以使用单引号,你使用的所有变量都将是来自目标机器的变量:

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

Bash函数

您可以通过将该命令包装在bash函数中来简化它。假设你只想输入这个:

sshcd example.com /foo/bar

你可以通过添加到~/.bashrc来实现:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

如果使用远程机器上存在的变量作为目录,请确保对其进行转义或将其放在单引号中。例如,这将cd到远程机器上存储在JBOSS_HOME变量中的目录:

sshcd example.com \$JBOSS_HOME

SSH配置文件

如果您希望使用普通的ssh命令在特定(或任何)主机上一直看到这种行为,而不必使用额外的命令行参数,您可以在ssh配置文件中设置RequestTTY和RemoteCommand选项。

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

ssh qaapps18

但希望它总是像这样的命令:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

所以我把这个加到~/。ssh /配置文件:

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

现在,该规则适用于主机名中包含“apps”的任何主机。

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

我使用环境变量CDPATH