su
コマンドにパスワードを渡すことができるスクリプトを書きたいと思います。これは、root以外のアカウントからrootにログインするプロセスを自動化するためです。セキュリティの基本的な理解から、これの危険性を知っています。ファイルからパスワードを読み取ってrootユーザーのパスワードを解読しようとする場合でも、これが必要です。
expect
コマンドを使用して対話を自動化することについて聞いたことがありますが、それがどのように機能するか、またはこの状況に適用できるかどうかはわかりません。 expect
の使用に関する情報をいただければ幸いです。
私のユーザーはsudoerリストに含まれていないため、Sudo
はオプションではないことに注意してください。
私が試したこと-パイプを使用してパスワードを渡す"su must be used from terminal"
タイプエラーのために機能しませんでした-echo
を使用してパスワードを渡すエコーされたものはすべて、パスワードを入力した後に表示されます
expect
を使用してその仕事をすることができます。以下をファイルに保存し、実行可能にして実行します。
#!/usr/bin/expect
spawn su
expect "Password:"
send "YOUR_PASS\n"
interact
(明らかに、expect
への正しいパスを指定する必要があります。ここでは、例として/usr/bin/expect
を使用しました。)
YOUR_PASS
が正しいルートパスワードである場合、ルートシェルが必要です。そうでない場合は、認証に失敗します。
interact
コマンドは、プロセスの制御をユーザーに提供するため、完全に自動化されたスクリプトのコンテキストではおそらく必要ないことに注意してください。つまり、キーストロークが現在のプロセスに送信され、stderrとstderrが返されます。 。
コマンドspawn
、expect
、send
、interact
、およびその他の多くのコマンドの詳細については、man expect
を参照してください。
この「ワンラインスタイル」を行う
expect -c 'spawn su - ;expect Password:;send "your-password\n";interact'
su -
の出力を見て、これがパスワードをキャプチャしているように見える正しいフレーズであるかどうかを確認します。ここではLinuxの翻訳版を使用しているので、Wordは「Password:」ではなく「Senha:」になります。
expect -c ''
:このコマンドに対して次のアクションを実行しますspawn su -
:このコマンドを実行しますexpect Password:
Wordパスワードが何かをすることを期待するsend "your-password\n"
:パスワードを入力し、Enterキーを押しますinteract
:コマンドに対する対話の準備をしておきます。