为另一个用户自动化命令行应用程序

为另一个用户自动化命令行应用程序

我对以下命令有问题。我想编写一个为另一个用户设置 vncpasswd 的脚本。如果我运行以下命令,它将仅适用于当前用户。

#< echo "passw0rd\npassw0rd\nn" | vncpasswd

但是,当运行下一个命令时,我遇到了问题,因为生成的回显不再是程序的有效输入。

#< su nonrootuser -c "echo "passw0rd\npassw0rd\nn" | vncpasswd"

#> Using password file /home/nonrootuser/.vnc/passwd
#> Password: Warning: password truncated to the length of 8.
#> Verify:   Passwords do not match. Please try again.

感谢您的回答! :D

答案1

根据 shell 的不同,该echo命令可能会也可能不会执行反斜杠扩展以变成\n换行符。例如,bash 默认情况下不这样做,但在shopt -s xpg_echo.

但是,即使echo内置函数sh在您的计算机上执行反斜杠扩展,由于您编写命令的方式,您的代码也不会触发该操作。您将字符串传递echo passw0rdnpassw0rdnn | vncpasswdsu命令:第二个双引号终止双引号字符串文字,第三个双引号启动新的双引号字符串文字,因此序列\n不在外壳中的双引号中,因此\n会展开到n。你本来想写类似的东西

su nonrootuser -c "echo -e 'passw0rd\npassw0rd\nn' | vncpasswd"

这样反斜杠就可以逐字地通过两个 shell,并传递选项-eecho告诉它执行反斜杠扩展。

echo但不要以不完全可移植的方式摆弄,只需调用printf(这是完全可靠的)或echo为每行运行一次:

su nonrootuser -c "{ echo 'passw0rd'; echo 'passw0rd'; echo n; } | vncpasswd"
su nonrootuser -c "printf '%s\n' 'passw0rd' 'passw0rd' n | vncpasswd"
su nonrootuser -c "
  vncpasswd <<EOF
passw0rd
passw0rd
n
EOF"

相关内容