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/53310533/

相关文章:

linux - 将 2 个文件的内容通过管道传递给 bash 中的 2 个不同参数

linux - 使用 Bash 读取文件然后使用针对文件本身的行执行 "grep"

regex - 带有多个参数的 pgrep -f

c - 如何清除 UNIX 系统上 tty 输入队列中的未读数据?

Linux 加载和执行 unix 脚本文件时出现错误

c++ - 在 C++ 中下载文件时做一个无限循环?

linux - 如何通过将 ids 列表与 LINUX 中的另一个数据文件进行比较来给予 ids 列表相同的排名?

linux - 运行远程脚本的意外行为

python - 如何从 Python 代码创建 Unix 和 Linux 二进制文件

Bash 不应将颜色代码计为可见字符