web-dev-qa-db-ja.com

スクリプトでSSHパスワードを自動的に入力する

OpenSSHのsshクライアントに自動的にパスワードを入力するスクリプトを作成する必要があります。

パスワード[email protected]a1234bにSSHでアクセスする必要があるとしましょう。

私はすでに試してみました...

#~/bin/myssh.sh
ssh [email protected]
a1234b

...しかしこれはうまくいきません。

この機能をスクリプトに組み込むにはどうすればいいですか。

156
user1467855

最初に sshpass をインストールする必要があります。

  • Ubuntu/Debian:apt-get install sshpass
  • Fedora/CentOS:yum install sshpass
  • アーチ:pacman -S sshpass

例:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no [email protected]_SITE.COM

カスタムポートの例:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no [email protected]_SITE.COM:2400

注:

  • sshpassは、-fフラグが渡されたときにファイルからパスワードを読み取ることもできます。
    • -fを使用すると、psコマンドが実行された場合にパスワードが表示されなくなります。
    • パスワードが保存されているファイルには、安全なアクセス許可が必要です。
230
abbotto

何ヶ月もの間その質問に対する答えを探した結果、私はついにより良い解決策を見つけました:簡単なスクリプトを書くこと。

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "assword:"
send "$password\r";
interact

それを/usr/bin/expに置くと、次のように使用できます。

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

完了しました。

79
damn_c

公開鍵認証を使用する: https://help.ubuntu.com/community/SSH/OpenSSH/Keys

ソースホストでこれを一度だけ実行します。

ssh-keygen -t rsa # ENTER to every field
ssh-copy-id [email protected]

パスワードがなくてもsshを実行できるようになります。

64
Diego Woitasen

あなたは期待スクリプトを使うことができます。私はかなりの時間でそれを書いていませんが、それは以下のように見えるはずです。スクリプトの先頭に#!/usr/bin/expectを付ける必要があります。

#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:" 
send "username\r"
expect "Password:"
send "password\r"
interact
26
Lipongo

変種I

sshpass -p PASSWORD ssh [email protected]

変種II

#!/usr/bin/expect -f
spawn ssh [email protected] "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact
19
RemiZOffAlex

セキュリティが向上したsshpass

私はこのスレッドでつまずいたサーバーにSSHで接続する方法を探していました - SSH接続の試行を処理するのに1分以上かかり、パスワードを入力できなくなるまでタイムアウトしました。この場合、私は自分のパスワードを すぐに プロンプトが利用可能になったときに入力できるようにしたいと考えました。

(そしてそれが痛いほど明確でないなら:この状態のサーバーで、公開鍵ログインを設定するには遅すぎます。)

救助へのsshpass。しかし、これを行うにはsshpass -pよりも優れた方法があります。

私の実装は対話型のパスワードプロンプト(直接公開鍵の交換が行われるかどうかを見るのに浪費されないことを見る時間)に直接スキップし、プレーンテキストとしてパスワードを決して明らかにしません。

#!/bin/sh
# preempt-ssh.sh
# usage: same arguments that you'd pass to ssh normally
echo "You're going to run (with our additions) ssh [email protected]"

# Read password interactively and save it to the environment
read -s -p "Password to use: " SSHPASS 
export SSHPASS

# have sshpass load the password from the environment, and skip public key auth
# all other args come directly from the input
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "[email protected]"

# clear the exported variable containing the password
unset SSHPASS
7
Ian

sshpass + autossh

既に言及したsshpassのいいところの1つのボーナスは、あなたがautosshと一緒にそれを使うことができることです。

sshpass -p mypassword autossh -M0 -t [email protected]

これにより、自動再接続が可能になります。あなたのwifiはあなたのラップトップを閉じることによって中断されます。

7
# create a file that echo's out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password...

echo "echo YerPasswordhere" > /tmp/1
chmod 777 /tmp/1

# sets some vars for ssh to play Nice with something to do with GUI but here we are using it to pass creds.


export SSH_ASKPASS="/tmp/1"
export DISPLAY=YOURDOINGITWRONG
setsid ssh [email protected] -p 22

参照: https://www.linkedin.com/Pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card

6
RmccurdyDOTcom

誰かがこれを提案するのを見たとは思わないし、OPはちょうど "script"と言ったので...

私は同じ問題を解決する必要があり、私の最も快適な言語はPythonです。

私はパラミコ図書館を使いました。さらに、Sudoを使用して権限を段階的に拡張する必要があるコマンドを発行する必要もありました。それは、Sudoが "-S"フラグを介してstdinを介してそのパスワードを受け入れることができることがわかりました!下記参照:

import paramiko

ssh_client = paramiko.SSHClient()

# To avoid an "unknown hosts" error. Solve this differently if you must...
ssh_client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())

# This mechanism uses a private key.
pkey = paramiko.RSAKey.from_private_key_file(PKEY_PATH)

# This mechanism uses a password.
# Get it from cli args or a file or hard code it, whatever works best for you
password = "password"

ssh_client.connect(hostname="my.Host.name.com",
                       username="username",

                       # Uncomment one of the following...
                       # password=password
                       # pkey=pkey
                       )

# do something restricted
# If you don't need escalated permissions, omit everything before "mkdir"
command "echo {} | Sudo -S mkdir /var/log/test_dir 2>/dev/null".format(password)

# In order to inspect the exit code
# you need go under paramiko's hood a bit
# rather than just using "ssh_client.exec_command()"
chan = ssh_client.get_transport().open_session()
chan.exec_command(command)

exit_status = chan.recv_exit_status()

if exit_status != 0:
    stderr = chan.recv_stderr(5000)

# Note that Sudo's "-S" flag will send the password Prompt to stderr
# so you will see that string here too, as well as the actual error.
# It was because of this behavior that we needed access to the exit code
# to assert success.

    logger.error("Uh oh")
    logger.error(stderr)
else:
    logger.info("Successful!")

これが誰かに役立つことを願っています。私のユースケースは、ディレクトリの作成、ファイルの送信と展開、そして一時には〜300台のサーバー上でのプログラムの起動です。そのため、自動化が最も重要でした。私はsshpassを試してみましたが、期待していましたがそれから思いついたのです。

私がそうしたのと同じくらい誰かに役立つことを願っています!

4
John Carrell

@abbottoの答えは私にはうまくいきませんでした。異なることをしなければなりませんでした:

  1. yum install sshpassを - rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6.x86_64.rpmに変更しました
  2. sshpassを使用するコマンドは - に変更されました。sshpass -p "pass" ssh user @ mysite -p 2122
1
MustSeeMelons

Rootユーザーに変更するよりも、自分のアカウントでログインする方がよい解決策があります。 bashスクリプトです

http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/ /

1
Xoroz

私はこれを次のように動かしました

.ssh/configがyes/noプロンプトを削除するように変更されました - 私はファイアウォールの内側にいるため、偽のSSHキーについては心配していません

Host *
     StrictHostKeyChecking no

Expectに対する応答ファイル、すなわちanswer.expectを作成します。

set timeout 20
set node [lindex $argv 0]
spawn ssh ro[email protected] service hadoop-hdfs-datanode restart

expect  "*?assword {
      send "password\r"   <- your password here.

interact

Bashスクリプトを作成して、ファイル内でexpectを呼び出すだけです。

#!/bin/bash
i=1
while [$i -lt 129]    # a few nodes here

  expect answer.expect hadoopslave$i

  i=[$i + 1]
  sleep 5

done

Hadoop/confファイルにNFSマウントを使用していると仮定して、128個のhadoopデータノードを新しい設定で更新します。

これが誰かに役立つことを願っています - 私はWindowsのナンプレで、これを理解するのに5時間ほどかかりました!

1
WT29

私はそれがうまくいったことに成功しました:

SSH_ASKPASS="echo \"my-pass-here\""
ssh -tt remotehost -l myusername
0

これが私のサーバーへのログイン方法です。

ssp <server_ip>
  • alias ssp = '/ home/myuser/Documents/ssh_script.sh'
  • cat /home/myuser/Documents/ssh_script.sh

    #!/ bin/bash

    sshpass -p mypassword ssh root @ $ 1

したがって...

ssp server_ip
0
DimiDak

Windowsシステムでこれを行う場合、Plink(PuTTYの一部)を使用できます。

plink [email protected] -pw your_password
0