bashスクリプトの中で私はsudoを非対話形式でエコーしたテキストをファイルにリダイレクトしようとしています。しかし、私はそれを行う方法については明確ではない。bashスクリプト:sudoいいえファイルへの対話的エコーリダイレクト
私はこのコードを試してみました:
echo $sudopass| sudo -S echo "user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible
bashスクリプトの中で私はsudoを非対話形式でエコーしたテキストをファイルにリダイレクトしようとしています。しかし、私はそれを行う方法については明確ではない。bashスクリプト:sudoいいえファイルへの対話的エコーリダイレクト
私はこのコードを試してみました:
echo $sudopass| sudo -S echo "user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible
出力のリダイレクトは、上昇sudo
権限の影響を受けません。 sudo
の部分は、echo
、ではなく、です。そのコマンドの出力のリダイレクトです。
それでもあなたの現在のユーザーの許可が得られます。
出力リダイレクトを含まないファイルに行を追加する方法が必要です。
注:対象のファイルが空または存在しない場合であるsed
balksとして削除sed
を展示この回答の以前のバージョン。答えの要点を「出力リダイレクトを避ける方法」にしておきたいので、同じ目的でvi
を使用する方法を説明しました。
すべてのPOSIX準拠のシステムはvi
/ex
エディタを持っている必要があります。 (compatiblityモードでVimを起動現代のLinuxマシンでは、通常のリンク。)あなたは、「リモコン」EX/VI/Vimのできるコマンドライン経由:
vi -es -c "normal! G" -c "normal! ouser ALL=(ALL) NOPASSWD:ALL" -c "x" /etc/sudoers.d/ansible
(これは明確にするためsudo
一部なしです。)
説明:
-e
は "EXモード" でvi
を開始します。 (ex
と同等)-s
は、「サイレント」を意味します。プロンプトは表示されず、メッセージも表示されません。-c
は、最初のファイルが読み込まれると実行されるコマンドをエディタに渡します。"normal! G"
最初にエディタを「通常モード」にします。つまり、対話的にvi
を起動した場合は、自分自身が見つけられるでしょう。 ex
はデフォルトで "コマンドモード"になります(viに:
を入力した場合のように)。 G
は、最後の行にカーソルを移動します。"normal! o..."
は、通常モードを再びアクティブにし、現在の行の後に行を追加し、「挿入モード」をアクティブにします。残りの文字列はそのまま入力されます。"x"
は、ファイルを保存してエディタを終了します。はsudo
一部を含むコマンドライン:
echo $sudopass | sudo -S vi -es -c "normal! G" -c "normal! ouser ALL=(ALL) NOPASSWD:ALL" -c "x" /etc/sudoers.d/ansible
ありがとう!このコードは完全に動作します。 –
"/etc/sudoers.d/ansible"ファイルが空であることを忘れてしまい、このsed commadは新しいテキストを追加するためのコンテンツが必要です。私はこの命令がsudoでリダイレクトを使用することがわかりましたが、もしスクリプト内でsudoを使ってsh comandを呼び出すのが良いかどうか、またはsudoを非対話型で空のファイルに挿入する他のよりエレガントな方法があるかどうかはわかりません。 > sudo -S sh -c 'echo "#ANSIBLE entry> /etc/sudoers.d/ansible" –
@ jhd00023:はい、 'sed'は、ターゲットファイルに以前の内容がない場合に動作します。代わりに 'vi 'を使う答えを変えました(元の" sudo'メッセージでリダイレクトを使わないでください)。もちろん、 'sh -c'への*リダイレクトを含めたコマンド全体を渡す方法も同様に機能します。 – DevSolar
が許可についてのご質問はありますか?あなたはあなたが得ている実際のエラーについて言及すべきです。 –