他のユーザーのためのコマンドラインアプリケーションの自動化

他のユーザーのためのコマンドラインアプリケーションの自動化

次のコマンドに問題があります。他のユーザーのために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\nn

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"

関連情報