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


148

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

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

パスワードなしの設定sudoはオプションではありません。

オプションかもしれませんが、それは私の簡素化されたシステムには存在しません。



回答:


215

sudoには、標準入力からパスワードを受け入れるための-Sオプションがあります。これがmanエントリです:

    -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については、その使用を自動化/スクリプト化しようと何度も試みましたが、成功しませんでした。プロンプトなしでパスワードをコマンドに渡す組み込みの方法はないようです。他の人が述べたように、「期待」ユーティリティはこのジレンマに対処することを目的としているようですが、最終的には、これを自動化しようとするときに正しい秘密鍵認証を設定することが正しい方法です。


2
幸い、RubyにはSSHクライアントが組み込まれており、パスワードを指定できます。ruby -e "require 'net / ssh'; Net :: SSH.start( 'example.com'、 'test_user'、:password => 'secret')do | ssh | puts 'Logged in successful'; while cmd = gets; puts ssh.exec!(cmd); end end "
user1158559

13
私はここでパーティープーパーになるのは嫌いですが、これを行うと、パスワードがプロセスリストに表示される可能性があります。私はより良い方法を決定しようとしていて、この記事に出くわし、誰もそれを指摘していなかったので驚いた。優れたソリューションですが、リスクに注意してください。
マット

sshについて、接続文字列でパスワードを渡してみましたか?好きnonroot:yourpassword@hostname.com?もちろん、キー認証とキーマネージャを使用すれば、はるかに簡単です。
キラー2015年

12
パスワードをファイルに入れてcatを使用することにより、プロセスリストまたはログファイルにパスワードが表示されないようにします。 'cat pw | sudo -S <command>、それ以降rm pw
CAB 2016年

もう1つの方法は、netcatを使用して、ソケット経由でパスワードを配信することです- nc -l 12345 | sudo -S <command>。送信側; echo myPassord | nc <target> 12345。これはパスワード処理の問題を解決するだけですが、おそらくより多くのオプションがあるマスターコンソールに移動します。
CAB 2016年

36

ダイアログボックスでパスワードを要求し、次のようなカスタムbashコマンドを作成するApplescriptをいくつか作成しました。

echo <password> | sudo -S <command>

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

sudoが事前に暗号化されたパスワードを受け入れたら、スクリプト内で暗号化でき、クリアテキストのパスワードがエコーされることを心配しなくてもよいでしょう。しかし、これは私と私の状況でうまくいきます。


27

以下のためにsshあなたが使用することができますsshpasssshpass -p yourpassphrase ssh user@host

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

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

12

私が持っている:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

私のために働く。


私のために働いていませんでした。それでもsshはパスワードの入力を求めます。
AKS

やっと、やっと使えるものになりました!ありがとう。私はこれを、sshセッションを開始してsudoコマンドをクライアントに渡すbashスクリプト内で使用します。SSHの-tユーザ名@ホスト名のbash -c「sudoのエコーfartjuice」:私のスクリプトがにライン決意を持っている
ジェームズ・T・スネル

12

sudoの場合もこれを行うことができます。

sudo -S <<< "password" command

10

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

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

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


10

これは、接続するターゲットホストに公開鍵/秘密鍵を設定することで実行できます。最初のステップは、次のコマンドを実行して、ローカルホストでスクリプトを実行しているユーザーの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ローカルホストからサイレントを実行できるようになります。


7

多分あなたはexpectコマンドを使うことができますか?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

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


見栄えは良いですが、ルート権限なしでマシンでexpectコマンドを有効にするにはどうすればよいですか?
Radon8472

1
@ Radon8472実行可能ファイルは、インストールする権限がない場合、〜/ binに追加できます。システムが〜/ binをPATHに自動的に追加しない場合は、export PATH = "$ PATH:〜/ bin"を使用して手動で追加するか、プロファイルにそのコマンドを追加して自動的に追加できます。PATHを変更したくない場合は、絶対パスを使用してコマンドを実行できます:〜/ bin / expect [引数]必ず実行可能ビットを設定してください:chmod +
x〜

6

(他の人が示唆するように)より良い選択がない場合、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のコマンドラインでリモートコマンドを渡すので、一見の価値があります。


1
これは実際にも機能しsuます。su-S(stdin)オプションはありません。
AUS

睡眠を避け、より信頼できるものを代わりに使用することは可能ですか?
マイケルパンコフ2016

6

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

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


1

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


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

sshキーを使用してユーザーとしてログインできる場合、sudoアクセスは問題ありません。ssh
Jack

0

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

@Jahidの答えに基づいて、これはmacOS 10.13で私にとってうまくいきました:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

より良いsshpass代替案は次のとおりです:https : passh //github.com/clarkwang/passh

リモートサーバーにログインする

 $ passh -p password ssh user@host

リモートサーバーでコマンドを実行する

 $ passh -p password ssh user@host date

パスワードを渡す他の方法

-pパスワード(デフォルト: `password ')

-p env:env varからパスワードを読み取ります

-p file:ファイルからパスワードを読み取ります

ここでは、sshpassや他のソリューションよりも優れている理由を説明しました。


-1
echo <password> | su -c <command> <user> 

これは機能しています。


1
これはFedoraで私にとって唯一の作品です。彼らは自分の状況で働いていないからといって人々は答えに反対票を投じますか?
Hangchen Yu

2
「su:端末から実行する必要があります」(RPi1B、Raspbian)
notme1560

残念ながら、これは最近のバージョンのにsuはありません。代わりにstdioからパスワードを読み取ります。
moutonjr

-1

expectスクリプトでパスワードをハードコーディングすることは、パスワードなしのsudoを使用することと同じですが、sudoは少なくともコマンドをログに記録するため、実際にはさらに悪いことです。


-1

1つの方法は、read -sオプションを使用することです。このようにして、パスワード文字が画面にエコーバックされません。私はいくつかのユースケースのために小さなスクリプトを書きました、そしてあなたは私のブログでそれを見ることができます:http : //www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/



-2

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


-11
su -c "Command" < "Password"

お役に立てば幸いです。


1
そうではありません。「su:端末から実行する必要があります」がこれに対する答えです。
thelogix 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.