使用完全登录外壳程序运行Remote ssh命令


48

我想做类似ssh example.com 'ls'然而但是每个ssh联机帮助页:

如果指定了命令,那么它将在远程主机而不是登录shell上执行。

所以发生的是ls显示它的输出,然后ssh退出。

我不知道的是如何打开完整的登录Shell,然后在该Shell中运行命令。运行命令后,使外壳保持打开状态。好像我已经手动执行以下操作:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

有任何想法吗?


这是一个类似的问题superuser.com/questions/261617/…,但是似乎没有一个答案真的符合我的尝试。
马修

怎么ssh example.com 'ls;bash'
2011年

您需要在我的系统上使用-i来使第二个外壳成为交互式外壳。
Flexo

选项-t是您问题的答案。还有其他选择(例如钥匙串),但是取决于您的实际需求,这对我来说还不够清楚。
hornetbzz 2011年

@hornetbzz -t给了我伪tty。但是除此之外,行为是相同的。我要启动一个交互式外壳程序,在该外壳程序中运行命令,并在命令运行后保持外壳程序处于打开状态。
马修

Answers:


40

只需告诉bash执行ls然后在登录shell中执行即可

$ ssh user@host  -t 'bash -l -c "ls;bash"'

2
不幸的是,使用时似乎无法正常工作screen。否则,这似乎像我想做的那样。
马修2013年

31
ssh user@host -t 'ls; exec $SHELL -l'

-t强制伪终端分配。这可用于在远程计算机上执行任意基于屏幕的程序。比稍微合适bash -i

exec 没有创建新的过程。

-l按此顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从中读取和执行命令...如果没有此命令,您可能无法从〜/ bin目录运行脚本/命令,因为此代码没有-l标志的情况下,〜/ .profile中的代码将不会执行:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

@grawity @Alan这可能是一种解决方法,但我真的希望命令在Shell中运行,而不仅仅是在命令运行后打开新的Shell。
马修

+ 1,-t绝对是跳过-i的正确方法,我只是忘了它。
Flexo

@matthew:您必须修补bash自己以允许这样做。
grawity 2011年

@grawity并非如此,请在下面查看我的答案
2013年

@matthew,使用exec bashexec $SHELL
尤金Konkov

1

在对fons的答案发表评论时,您说使用时它不起作用screen

您能详细说明一下吗?查看openssh的源代码,sshd通过调用执行命令

YOUR_DEFAULT_SHELL -c COMMAND

因此,举例来说,如果您的默认外壳程序是screen,那么这将不能很好地工作,因为screen-c标记仅覆盖其.scrreenrc。因此,如果这是您的默认外壳程序,则实际上没有办法将命令发送到屏幕。您必须实际运行screen作为给ssh的命令,但要使用默认的shell而不是screen

如果这是您要尝试的操作,我认为事情会变得很奇怪,因为screen这还会关闭具有非交互式程序的窗口,因此您将必须执行类似于fons的技巧,但要更深一层。这样,例如,/ bin / bash (而不是屏幕)作为默认外壳,例如:

ssh user@host -t 'screen bash -l -c "ls;bash"'

哪个应该-深呼吸-ssh进入主机,并使用screen命令运行bash -c,这将创建一个新窗口。如果此窗口刚刚打开ls,它将结束,屏幕将终止,因此我们在新的屏幕窗口内使用fons的技巧。

我想那会行得通的,即使那是您正在尝试做的事;)


我认为screen在这种情况下,我遇到的问题是我通常会exec screen -RR从加载它.profile。这意味着bash -l试图加载屏幕,从而甩掉其余部分。看来我可以通过在您的解决方案和@fons解决方案中都删除“ -l”来解决它(然后您将我留在了screen)。不过有点儿古怪。
马修2013年

0

多个-t选项强制tty分配,即使ssh没有本地tty也是如此:

ssh -tt user@host 'bash -l -c "/path/to/command'
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.