私のスクリプトには機能する行がありますが、コマンドラインからは実行できません。
echo "User ALL = NOPASSWD: ALL, !/bin/su" | sudo tee -a /etc/sudoers
[user@localhost ~]$ echo "test ALL = NOPASSWD: ALL, !/bin/su" | sudo tee -a /etc/sudoers
bash: !/bin/su": event not found
[user@localhost ~]$
編集:コマンド権限なしでsudoユーザーを追加しようとしていますが、su
sudoユーザーが利用可能ですsudo -i
。私はちょうどそのスクリプトのすべてのコマンドをチェックして、コマンドラインでどのように機能するかを確認しました。
使用する必要がある回避策をコマンドラインで見つけました"'!'"/bin/su
。これがコマンドラインで機能しない理由を説明できる人はいますか?
ベストアンサー1
[あなたは正しい方法で仕事をしていないようです。あなたの質問に関連するコメントをよく読んでください。sudo
]
には、bash
コマンドラインで有効にできる「記録の置き換え」というメカニズムがあります。これにより、前のコマンドの全部または一部を編集中のコマンド(したがって「history」という名前)に挿入できます。
履歴の交換をトリガーする文字はです!
。たとえば、!WORD
で始まる最後のコマンドで置き換えますWORD
。そのようなコマンドがないと、bash
次のエラーメッセージが表示されますbash: !WORD: event not found
。
!
履歴置換メカニズムを有効にせずにaを入力する必要がある場合は、エスケープするか、\!
単一引用符で囲む必要があります'!'
。
たとえば、echo 'User ALL = NOPASSWD: ALL, !/bin/su' | ...
履歴拡張が面倒な場合は、を使用して無効にし、set +H
引用符なしでコマンドを入力し、後でを使用して!
再度有効にすることもできますset -H
。