Answers:
您可以执行以下操作:
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"
这样,您将在directory_wanted上获得一个外壳。
说明
-t
强制伪终端分配。这可用于在远程计算机上执行任意基于屏幕的程序,这可能非常有用,例如在实现菜单服务时。
-t
即使ssh没有本地tty,多个选项也会强制tty分配。
-t
则不会出现提示。; bash
则连接将关闭,并将控制权返回给本地计算机ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
ssh server -t "cd /my/remote/directory; bash --login"
您可以添加
cd /some/directory/somewhere/named/Foo
到另一台主机上的.bashrc
文件(或.profile
任何您称呼它的文件)。这样,无论您做什么工作或ssh
来自何处,无论何时登录该服务器,它都会cd
为您找到适当的目录,并且您所要做的就是像平常一样使用ssh
。
当然,rogeriopvl的解决方案也可以使用,但是有点冗长,而且您每次都必须记住要进行此操作(除非您创建别名),这样看起来“乐趣”就少了。
我的首选方法是使用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_HOME
如果您希望通过普通的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
根据@rogeriopvl答案的补充,我建议以下内容:
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"
链接命令by &&
将使下一个命令仅在上一个命令成功时才运行(与using相对;
,后者按顺序执行命令)。当需要到cd
执行命令的目录时,这特别有用。
想象一下,执行以下操作:
/home/me$ cd /usr/share/teminal; rm -R *
该目录teminal
不存在,这将导致您留在主目录中,并使用以下命令删除其中的所有文件。
如果您使用&&
:
/home/me$ cd /usr/share/teminal && rm -R *
找不到目录后,该命令将失败。
在我的特定情况下,我只想在Jenkins从属机器的特定目录内的远程主机中执行命令:
ssh myuser@mydomain
cd /home/myuser/somedir
./commandThatMustBeRunInside_somedir
exit
但是我的机器无法执行ssh(我想它无法分配伪tty),并让我给出以下错误:
Pseudo-terminal will not be allocated because stdin is not a terminal
我可以绕过此问题,将“ cd to dir + my command”作为ssh命令的参数传递(不必分配伪终端),并通过传递选项-T明确告诉ssh命令我没有不需要伪终端分配。
ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
在这个-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"