su
またはSudo
またはssh
を実行するCシェルプログラムを作成しています。彼らはすべて、stdinやコマンドラインではなく、コンソール入力(TTY)でパスワードを求めています。
誰もが解決策を知っていますか?
パスワードなしのSudo
のセットアップはオプションではありません。
expect はオプションの可能性がありますが、必要最低限のシステムには存在しません。
Sudoの場合、標準入力からパスワードを受け入れるための-Sオプションがあります。男性のエントリは次のとおりです。
-S The -S (stdin) option causes Sudo to read the password from
the standard input instead of the terminal device.
これにより、次のようなコマンドを実行できます。
echo myPassword | Sudo -S ls /tmp
Sshに関しては、その使用を自動化/スクリプト化するために多くの試みを行いましたが、成功しませんでした。プロンプトなしでコマンドにパスワードを渡す組み込みの方法はないようです。他の人が言ったように、「 expect 」ユーティリティはこのジレンマに対処することを目的としているように見えますが、最終的に、これを自動化しようとする場合は正しい秘密鍵認証を設定することが正しい方法です。
ダイアログボックスを介してパスワードの入力を求めるApplescriptを作成し、次のようにカスタムbashコマンドを作成します。
echo <password> | Sudo -S <command>
これが役立つかどうかはわかりません。
Sudoが事前に暗号化されたパスワードを受け入れてくれればいいので、スクリプト内で暗号化でき、クリアテキストのパスワードをエコーする心配はありません。しかし、これは私と私の状況で機能します。
ssh
には、sshpass
:sshpass -p yourpassphrase ssh user@Host
を使用できます。
最初にsshpassをダウンロードするだけです:)
$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
私が持っている:
ssh user@Host bash -c "echo mypass | Sudo -S mycommand"
私のために働く。
これは、接続するターゲットホストで公開/秘密キーを設定することで実行できます。最初のステップは、ローカルホストでスクリプトを実行しているユーザーのsshキーを生成することです。次を実行します。
ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y
次に、空のパスワードを入力します。その後、sshキーを接続先のターゲットホストにコピーします。
ssh-copy-id <remote_user>@<other_Host>
remote_user@other_Host's password: <Enter remote user's password here>
Sshキーを登録した後、ローカルホストからサイレントssh remote_user@other_Host
を実行できます。
この問題の通常の解決策は、スーパーユーザーのアクセスを必要とするタスクを実行するヘルパーアプリを設定することです。 http://en.wikipedia.org/wiki/Setuid
Sudoはオフラインで使用するためのものではありません。
後の編集:SSHは秘密鍵と公開鍵の認証で使用できます。秘密鍵にパスフレーズがない場合は、パスワードの入力を求めずにsshを使用できます。
Sudoの場合、これも実行できます。
Sudo -S <<< "password" command
(他の人が提案したように)より良い選択がない場合は、man socatが役立ちます:
(sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
socat - EXEC:'ssh -l user server',pty,setsid,ctty
EXEC’utes an ssh session to server. Uses a pty for communication
between socat and ssh, makes it ssh’s controlling tty (ctty),
and makes this pty the owner of a new process group (setsid), so
ssh accepts the password from socat.
すべてのpty、setsid、cttyの複雑さが必要です。長い間スリープする必要はないかもしれませんが、スリープする必要があります。 echo = 0オプションも一見の価値があります。sshのコマンドラインでリモートコマンドを渡すのと同じです。
expect
linuxユーティリティを見てください。
Stdinでの単純なパターンマッチングに基づいて、stdioに出力を送信できます。
expect
コマンドを使用できますか?:
expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact
そのコマンドはパスワードを自動的に与えます。
キーにパスフレーズを付けずに、公開キー認証用にSSHをセットアップします。ネット上のガイドの負荷。その場合、ログインにパスワードは必要ありません。その後、クライアントのホスト名に基づいてキーの接続を制限できます。適切なセキュリティを提供し、自動ログインに最適です。
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | Sudo -S do something
Sudo do something else
exit
EOF
スクリプトを期待するパラメータとしてパスワードを提供できます。
@Jahidの答えに基づいて、これはmacOS 10.13で私のために働いた:
ssh <remote_username>@<remote_server> Sudo -S <<< <remote_password> cat /etc/sudoers
同じ問題がありました。リモートPCにディレクトリを作成するダイアログスクリプト。 sshとのダイアログは簡単です。 sshpass(以前にインストールした)を使用します。
dialog --inputbox "Enter IP" 8 78 2> /tmp/ip
IP=$(cat /tmp/ip)
dialog --inputbox "Please enter username" 8 78 2> /tmp/user
US=$(cat /tmp/user)
dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass
PASSWORD = $(cat /tmp/pass)
sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER
rm /tmp/ip
rm /tmp/user
rm /tmp/pass
ドイツからのご挨拶
ティタス
つかいます:
echo password | Sudo command
例:
echo password | Sudo apt-get update; whoami
それが役に立てば幸い..