我需要逐行解析文件并将在其中找到的值传递给 FreeBSD 中的 2 个命令sh
(不能使用其他 shell)。
我的计划是使用xargs
and su
:
whatever_outputs_values | xargs -I {} su `whoami` -c "cmd1 {}; cmd2 {}"
因为在 FreeBSD 中,su
同一用户使用时不需要密码。这在终端中执行得很好并产生正确的结果,尽管速度很慢。但我必须在程序代码中运行它,并且该命令挂起。我 99% 确信它会挂起,因为由于我看不到的情况,SSH 库导致它等待密码输入。因此,我正在寻找 的替代方案su
whoami
,保证不等待密码。它可能可能是一个for
循环,但来自 Linuxbash
背景的我无法设计一个工作for
循环sh
。
答案1
我不会用su
这个,但是sh -c
。这将使它变得便携并且可能更快一些。我还会避免注入左侧命令的输出作为代码进入右侧的shell命令(这是一个代码注入漏洞)。
some-command | xargs -I {} sh -c 'cmd1 "$1"; cmd2 "$1"' sh {}
这会多次调用内联sh -c
脚本,每次都使用一个参数。该参数用于调用cmd1
and cmd2
。
该sh
参数是一个“虚拟”参数,将传递到$0
内联脚本内部。这应该是脚本或 shell 的名称,并且将在 shell 生成的任何错误消息中使用它(例如找不到命令时等)