如何直接ssh到特定目录?

时间:2009-03-09 14:50:21

标签: bash shell scripting ssh

我经常需要登录其中一台服务器并转到这些机器上的多个目录中的一个。目前我做了类似的事情:

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

是否有一种简单,聪明或任何方式可以做到这一点?

12 个答案:

答案 0 :(得分:352)

您可以执行以下操作:

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

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


解释

  

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

     

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

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

答案 1 :(得分:45)

你可以添加

cd /some/directory/somewhere/named/Foo

到另一台主机上的.bashrc文件(或.profile或其他任何名称)。这样,无论你做什么或从ssh开始,只要你登录到那台服务器,它就会cd到你正确的目录,你所要做的就是使用{{1像正常一样。

诅咒,rogeriopvl的解决方案也有效,但它有点冗长,你必须记住每次都这样做(除非你做一个别名)所以它似乎不那么“有趣”。

答案 2 :(得分:18)

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

sshcd somehost:/some/directory/somewhere/named/Foo

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

答案 3 :(得分:7)

根据@ 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 *

找不到目录后命令将失败。

答案 4 :(得分:3)

我的首选方法是使用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和{{1} }选项在ssh配置文件中。

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

RemoteCommand

但希望它始终像这样执行命令:

ssh qaapps18

因此我将其添加到了ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL' 文件中:

~/.ssh/config

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

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

答案 5 :(得分:2)

我使用环境变量CDPATH

答案 6 :(得分:2)

在我的特定情况下,我只想在远程主机中执行命令,在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到dir +我的命令"作为ssh命令的参数(不必分配伪终端),并通过传递选项-T明确告诉ssh命令我不需要伪终端分配。

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"

答案 7 :(得分:2)

我的回答可能与您真正想要的有所不同,但我写在这里可能对某些人有用。在我的解决方案中,您必须进入该目录一次,然后每个新的 ssh 会话都会转到同一个目录(在第一次注销之后)。

如何通过 ssh 连接到您上次登录时所在的目录。 (我假设您在远程节点上使用 bash。)

将此行添加到 远程节点(!) 上的 ~/.bash_logout 中:

echo $PWD > ~/.bash_lastpwd

并将这些行添加到 ~/.bashrc 文件(仍在远程节点!)

if [ -f ~/.bash_lastpwd ]; then
    cd $(cat ~/.bash_lastpwd)
fi

这样您就可以在每次注销时保存当前路径,并在登录后 .bashrc 将您放入该目录。

ps:您可以进一步调整它,例如使用 SSH_CLIENT 变量来决定是否进入该目录,因此您可以区分本地登录和 ssh,甚至不同的 ssh 客户端。

答案 8 :(得分:1)

登录后直接进入的另一种方法是创建“Alias”。当您登录系统时,只需键入该别名,您就会进入该目录。

示例:Alias = myfolder'/ var / www / Folder'

登录到别名的系统类型后(这适用于系统的任何部分)
如果不在bashrc中,此命令将适用于当前会话。所以你也可以在bashrc中添加这个别名,以便将来使用它

$ myfolder =>带你到那个文件夹

答案 9 :(得分:0)

我知道很久以前就已经回答了这个问题,但是我尝试将ssh登录并入bash脚本时发现了问题,一旦登录,请运行一些命令,然后注销并继续使用bash脚本。我发现最简单的方法是这样做。

#!/bin/bash

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

答案 10 :(得分:-1)

SSH本身提供了一种通信方式,它对目录一无所知。既然你可以指定要执行哪个远程命令(这是 - 默认情况下 - 你的shell),我就从那里开始。

答案 11 :(得分:-5)

只需使用以下命令修改您的家: usermod -d /newhome username