我对以下命令有问题。我想编写一个为另一个用户设置 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 | vncpasswd
给su
命令:第二个双引号终止双引号字符串文字,第三个双引号启动新的双引号字符串文字,因此序列\n
不在外壳中的双引号中,因此\n
会展开到n
。你本来想写类似的东西
su nonrootuser -c "echo -e 'passw0rd\npassw0rd\nn' | vncpasswd"
这样反斜杠就可以逐字地通过两个 shell,并传递选项-e
来echo
告诉它执行反斜杠扩展。
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"