如何直接ssh到特定目录?


248

我经常必须登录到几台服务器之一,并转到那些机器上的几目录之一。目前,我正在执行以下操作:

本地主机〜] $ ssh somehost

欢迎来到主持人!

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

我有一些脚本可以确定我需要进入哪个主机和哪个目录,但是我无法找出执行此操作的方法:

本地主机〜] $ go_to_dir Foo

欢迎来到主持人!

somehost Foo] $

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

Answers:


413

您可以执行以下操作:

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

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


说明

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

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

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

21
在我的情况下-t缺少的部分
Mathieu'1

2
使用这种方法时,不会读取.bash_profile,有人知道为什么吗?
Filipe 2012年

8
我必须这样做: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron

40
您通常会需要一个登录shell:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy 2014年

10
只是想链路上ssh登录自动更改目录-服务器故障 ; 然后从那里粘贴此命令(这是@christianbundy的版本):ssh server -t "cd /my/remote/directory; bash --login"
sdaau 2014年

53

您可以添加

cd /some/directory/somewhere/named/Foo

到另一台主机上的.bashrc文件(或.profile任何您称呼它的文件)。这样,无论您做什么工作或ssh来自何处,无论何时登录该服务器,它都会cd为您找到适当的目录,并且您所要做的就是像平常一样使用ssh

当然,rogeriopvl的解决方案也可以使用,但是有点冗长,而且您每次都必须记住要进行此操作(除非您创建别名),这样看起来“乐趣”就少了。


1
+1,如果您需要恒定的目录而不是让ssh命令更长的时间记住每次连接到X机器时要移动到的目录,这似乎更合适
Tebe

灵活更改时不合适
Lewis Chan

21

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

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

让我知道您是否有任何疑问或问题!


1
如果您可以在〜/ .ssh / config中定义一个新配置并从那里读取它,那将
很酷

21

我的首选方法是使用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命令始终看到特定(或任何)主机的这种行为,而不必使用额外的命令行参数,则可以在ssh配置文件中设置RequestTTYRemoteCommand选项。

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

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


13

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

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


1
使用不带&&的命令使用单引号而不是双引号一次,这使我陷入困境,糟糕的是……吸取了教训。
加文·皮金

4

在我的特定情况下,我只想在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"

3

我使用环境变量CDPATH


仅当我对每台计算机的一个目录感兴趣时才有用。我需要一种将信息传递到远程计算机的方法。罗杰的解决方案就是这样做的。

2

在这个-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"

1

登录后直接进入另一种方法是创建“别名”。当您登录系统时,只需键入该别名即可,您将位于该目录中。

示例:别名= myfolder'/ var / www / Folder'

登录到系统后,键入该别名(可在系统的任何部分使用),
如果不在bashrc中,则此命令适用于当前会话。因此,您也可以将此别名添加到bashrc中,以备将来使用

$ myfolder =>带您到该文件夹


-3

SSH本身提供了一种通信方式,它对目录一无所知。由于您可以指定要执行的远程命令(默认情况下,这是您的Shell),因此我将从此处开始。


4
这是部分答案,而不是解决方案。
AL 2014年

-7

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


1
不建议。更改主目录可能会导致其他问题。
bronson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.