要重现,打开一个终端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中执行。
答案 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 /
等恶意输出。