次のコマンドに問題があります。他のユーザーのために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
シェルによっては、このecho
コマンドはバックスラッシュを改行文字に拡張したり実行したりしない場合があります\n
。たとえば、bashはデフォルトではこれを行いませんがshopt -s xpg_echo
。
echo
ただし、組み込み関数がsh
コンピュータでバックスラッシュ拡張を実行しても、コマンドを書いた方法でコードがその操作をトリガーしません。コマンドecho passw0rdnpassw0rdnn | vncpasswd
に文字列を渡します。 2番目の二重引用符は二重引用符で囲まれた文字列リテラルを終了し、3番目の二重引用符は二重引用符で囲まれた新しい文字列リテラルを開始し、そのシーケンスはシェルの二重引用符内にないために拡張されます。あなたはもともと次のようなものを書きたかったのです。su
\n
\n
n
su nonrootuser -c "echo -e 'passw0rd\npassw0rd\nn' | vncpasswd"
これにより、バックスラッシュが両方のシェルを文字通り通過してバックスラッシュ拡張を実行するように指示するオプションを渡すことができ-e
ますecho
。
echo
しかし、完全に移植可能でない方法で触れるのではなく、呼び出しprintf
(完全に信頼できる)またはecho
各行に対して1回実行します。
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"