退出后连接的ssh命令

时间:2016-01-29 22:35:26

标签: bash

要重现,打开一个终端ssh会话,现在,执行bash或sh shell,你将进入另一个shell,问题是,存在以任何方式退出shell并在连接中创建的第一个shell中执行命令?

示例:

bash-4.1$ /bin/sh
sh-4.1$ exit;ls
exit
bash-4.1$

如您所见,在“sh”shell中执行“exit”命令后,“ls”命令不会在“bash”shell中执行。

5 个答案:

答案 0 :(得分:1)

好的...

$ $(ssh othersystem echo ls)

从根本上说,您需要一个反向沟通渠道。交互式目标外壳是一种特别不适合的发射器。

所拥有的一个频道是退出状态,因此:

$ ssh othersystem
other$ exit 5
$ if [ $? -eq 5 ]; then echo how now; ls; fi # whatever

答案 1 :(得分:1)

你所谓的“串联命令”无法做到这一点。问题是exit;ls是一个给“sh”shell执行的命令。你毕竟在“sh”命令提示符下输入它,一旦“sh”退出,你给它的命令就不再存在了。

至于“bash”shell,它正忙于运行“sh”shell直到它退出;只有这样才能“猛击”运行不同的命令。就“bash”shell而言,它只是运行“命令”,当命令退出时,它将返回代码,就是这样。他们之间没有沟通。

答案 2 :(得分:0)

如果您希望原始shell执行ls命令,则需要将其放在该shell的命令行中:

bash-4.1$ /bin/sh; ls
sh-4.1$ exit
<output of ls>
bash-4.1$

当您向exit;ls进程输入sh时,它会读取整行并在那里执行命令; ls命令未保留在标准输入流中,以供bash进程读取。

答案 3 :(得分:0)

虽然从儿童chell到父shell有no direct possibility to return data,但有

1)又快又脏

将内部shell的命令放入脚本(1.sh

#!/bin/bash
a=5; b=7;
echo "export "a="$a"
echo "export "b="$b"

然后,在外部shell中以这种方式调用内部脚本(shell):

`./1.sh`

在外壳中再次检查结果:

:~$ echo $a
5
:~$ echo $b
7

2)将所有数据写入临时文件。您可以使用 tmpfs mount | grep tmpfs来确定它被瞄准的位置)tha是RAM中的块设备,不会将任何内容保存到磁盘。

答案 4 :(得分:0)

如果远程主机上有进程生成要在本地主机上执行的命令脚本,则可以将远程主机的输出通过管道传输到新的shell会话:

ssh remotehost "echo ls" | sh

如果你需要在调用shell中运行它,那么这可以工作:

eval $(ssh remotehost "echo ls")

显然,您必须相信远程主机不会生成rm -rf $HOME/*rm -rf /等恶意输出。