gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:28 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com