我经常需要登录到几台服务器中的一台并转到这些机器上的几个目录中的一个.目前我做了这样的事情:
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]$
有一个简单,聪明或任何方式来做到这一点?
您可以执行以下操作:
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"
这样,您将在directory_wanted上获得一个shell.
说明
-t
强制伪终端分配.这可以用于在远程机器上执行任意基于屏幕的程序,这可以是非常有用的,例如在实现菜单服务时.
-t
即使ssh没有本地tty,多个选项也会强制tty分配.
如果您不使用,-t
则不会出现提示.
如果不添加,; bash
则连接将关闭并将控制权返回给本地计算机
你可以添加
cd /some/directory/somewhere/named/Foo
到另一台主机上的.bashrc
文件(或.profile
其他任何名称).这样,无论你做什么或ssh
来自哪里,每当你登录到那台服务器时,它都会cd
到你正确的目录,而你所要做的就是ssh
正常使用.
诅咒,rogeriopvl的解决方案也有效,但它有点冗长,你必须记住每次都这样做(除非你做一个别名)所以它看起来有点"有趣".
我已经连续创建了一个SSH和CD到服务器的工具 - 恰当地命名为sshcd.对于您给出的示例,您只需使用:
sshcd somehost:/some/directory/somewhere/named/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 *
找不到目录后,该命令将失败.
我的首选方法是使用SSH配置文件(如下所述),但是根据您的使用情况,有几种可能的解决方案。
命令行参数我认为此方法的最佳答案是christianbundy对已接受答案的答复:
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
使用双引号将允许您使用本地计算机中的变量,除非将它们转义(如此$SHELL
处所示)。或者,您可以使用单引号,并且所有使用的变量都是目标计算机上的变量:
ssh -t example.com 'cd /foo/bar; exec $SHELL -l'重击功能
您可以通过将命令包装在bash函数中来简化该命令。假设您只想输入以下内容:
sshcd example.com /foo/bar
您可以通过将其添加到您的服务器中来使其工作~/.bashrc
:
sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }
如果您使用远程计算机上存在的目录变量,请确保对其进行转义或将其置于单引号中。例如,将其cd到存储在JBOSS_HOME
远程计算机上的变量中的目录:
sshcd example.com \$JBOSS_HOMESSH配置文件
如果您希望始终使用普通的ssh命令针对特定(或任何)主机查看此行为,而不必使用额外的命令行参数,则可以在ssh配置文件中设置RequestTTY
和RemoteCommand
选项。
例如,我只想输入以下命令:
ssh qaapps18
但希望它始终像以下命令一样运行:
ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'
所以我将其添加到我的~/.ssh/config
文件中:
Host *apps* RequestTTY yes RemoteCommand cd $JBOSS_HOME; exec $SHELL
现在,此规则适用于主机名中带有“ apps”的任何主机。
有关更多信息,请参见http://man7.org/linux/man-pages/man5/ssh_config.5.html