bash - 将命令作为输入传递给另一个命令(su、ssh、sh 等)

标签 bash shell unix ssh sh

我有一个脚本,我需要在其中启动命令,然后将一些附加命令作为命令 传递给该命令。我试过了

su
echo I should be root now:
who am I
exit
echo done.

... 但它不起作用:su 成功,但命令提示符只是盯着我看。如果我在提示符下键入 exitechowho am i 等就会开始执行! echo done. 根本没有执行。

同样,我需要通过 ssh 进行操作:

ssh remotehost
# this should run under my account on remotehost
su
## this should run as root on remotehost
whoami
exit
## back
exit
# back

我该如何解决?

I am looking for answers which solve this in a general fashion, and which are not specific to su or ssh in particular. The intent is for this question to become a canonical for this particular pattern.

最佳答案

添加到 tripleeeanswer :

重要的是要记住,格式化为另一个 shell 的 here-document 的脚本部分是在具有自己环境的不同 shell 中执行的(甚至可能在不同的机器上)。

如果您的脚本 block 包含参数扩展、命令替换和/或算术扩展,那么您必须使用略有不同的 shell 的 here-document 工具,具体取决于您希望在何处执行这些扩展。

1。所有扩展都必须在父 shell 的范围内执行。

然后此处文档的分隔符必须不加引号

command <<DELIMITER
...
DELIMITER

例子:

#!/bin/bash

a=0
mylogin=$(whoami)
sudo sh <<END
    a=1
    mylogin=$(whoami)
    echo a=$a
    echo mylogin=$mylogin
END
echo a=$a
echo mylogin=$mylogin

输出:

a=0
mylogin=leon
a=0
mylogin=leon

2。所有扩展都必须在子 shell 的范围内执行。

然后此处文档的分隔符必须被引号

command <<'DELIMITER'
...
DELIMITER

例子:

#!/bin/bash

a=0
mylogin=$(whoami)
sudo sh <<'END'
    a=1
    mylogin=$(whoami)
    echo a=$a
    echo mylogin=$mylogin
END
echo a=$a
echo mylogin=$mylogin

输出:

a=1
mylogin=root
a=0
mylogin=leon

3。一些扩展必须在子 shell 中执行,一些 - 在父 shell 中执行。

然后此处文档的定界符必须未加引号并且您必须转义那些必须在子 shell 中执行的扩展表达式

例子:

#!/bin/bash

a=0
mylogin=$(whoami)
sudo sh <<END
    a=1
    mylogin=\$(whoami)
    echo a=$a
    echo mylogin=\$mylogin
END
echo a=$a
echo mylogin=$mylogin

输出:

a=0
mylogin=root
a=0
mylogin=leon

关于bash - 将命令作为输入传递给另一个命令(su、ssh、sh 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57900055/

相关文章:

linux - linux 上的 mdfind 等价物?

linux - 在 suse linux 中远程启用和禁用 cronjob

Shell:在第一个空行之前获取所有行的简单方法

c - c代码中su命令的使用

显示系统物理 IP 的 linux 命令

shell - 如何在shell脚本中查找目录中的特定文件?

linux - 重启后命令提示符更改

linux - 通过网络获取最新版本 rpm 的最有效方法

windows - 保持 Windows 和 'Bash on Ubuntu on Windows' 之间的路径同步

bash - 如何自动从 Harbor 中删除 Docker 镜像?