web-dev-qa-db-ja.com

TTYを上書きせずにパスワードをsu / Sudo / sshに渡す方法は?

suまたはSudoまたはsshを実行するCシェルプログラムを作成しています。彼らはすべて、stdinやコマンドラインではなく、コンソール入力(TTY)でパスワードを求めています。

誰もが解決策を知っていますか?

パスワードなしのSudoのセットアップはオプションではありません。

expect はオプションの可能性がありますが、必要最低限​​のシステムには存在しません。

137
n-alexander

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 」ユーティリティはこのジレンマに対処することを目的としているように見えますが、最終的に、これを自動化しようとする場合は正しい秘密鍵認証を設定することが正しい方法です。

201
Jesse Webb

ダイアログボックスを介してパスワードの入力を求めるApplescriptを作成し、次のようにカスタムbashコマンドを作成します。

echo <password> | Sudo -S <command>

これが役立つかどうかはわかりません。

Sudoが事前に暗号化されたパスワードを受け入れてくれればいいので、スクリプト内で暗号化でき、クリアテキストのパスワードをエコーする心配はありません。しかし、これは私と私の状況で機能します。

35
mlambie

sshには、sshpasssshpass -p yourpassphrase ssh user@Hostを使用できます。

最初にsshpassをダウンロードするだけです:)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
25
Edward

私が持っている:

ssh user@Host bash -c "echo mypass | Sudo -S mycommand"

私のために働く。

12
David Dawson

これは、接続するターゲットホストで公開/秘密キーを設定することで実行できます。最初のステップは、ローカルホストでスクリプトを実行しているユーザーの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を実行できます。

10
Byob

この問題の通常の解決策は、スーパーユーザーのアクセスを必要とするタスクを実行するヘルパーアプリを設定することです。 http://en.wikipedia.org/wiki/Setuid

Sudoはオフラインで使用するためのものではありません。

後の編集:SSHは秘密鍵と公開鍵の認証で使用できます。秘密鍵にパスフレーズがない場合は、パスワードの入力を求めずにsshを使用できます。

9
diciu

Sudoの場合、これも実行できます。

Sudo -S <<< "password" command
9
Jahid

(他の人が提案したように)より良い選択がない場合は、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のコマンドラインでリモートコマンドを渡すのと同じです。

6
Martin Dorey

expect linuxユーティリティを見てください。

Stdinでの単純なパターンマッチングに基づいて、stdioに出力を送信できます。

5
Marko

expectコマンドを使用できますか?:

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact

そのコマンドはパスワードを自動的に与えます。

5
adhown

キーにパスフレーズを付けずに、公開キー認証用にSSHをセットアップします。ネット上のガイドの負荷。その場合、ログインにパスワードは必要ありません。その後、クライアントのホスト名に基づいてキーの接続を制限できます。適切なセキュリティを提供し、自動ログインに最適です。

1
Chris Ellis
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | Sudo -S do something
Sudo do something else
exit
EOF
1
Ed Bishop

スクリプトを期待するパラメータとしてパスワードを提供できます。

0
Marko

@Jahidの答えに基づいて、これはmacOS 10.13で私のために働いた:

ssh <remote_username>@<remote_server> Sudo -S <<< <remote_password> cat /etc/sudoers
0
JS.

同じ問題がありました。リモート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

ドイツからのご挨拶

ティタス

0
titus

つかいます:

echo password | Sudo command

例:

echo password | Sudo apt-get update; whoami

それが役に立てば幸い..

0
Sarat Chandra