OpenSSH ssh
クライアントにパスワードを自動的に入力するスクリプトを作成する必要があります。
たとえばmyname@somehost
、パスワードを使用してSSHでログインする必要があるとしますa1234b
。
私はすでに試しました...
#~/bin/myssh.sh
ssh myname@somehost
a1234b
...しかし、これは機能しません。
この機能をスクリプトに組み込むにはどうすればよいですか?
OpenSSH ssh
クライアントにパスワードを自動的に入力するスクリプトを作成する必要があります。
たとえばmyname@somehost
、パスワードを使用してSSHでログインする必要があるとしますa1234b
。
私はすでに試しました...
#~/bin/myssh.sh
ssh myname@somehost
a1234b
...しかし、これは機能しません。
この機能をスクリプトに組み込むにはどうすればよいですか?
回答:
最初にsshpassをインストールする必要があります。
apt-get install sshpass
yum install sshpass
pacman -S sshpass
例:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM
カスタムポートの例:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400
ノート:
sshpass
-f
フラグが渡されたときにファイルからパスワードを読み取ることもできます。
-f
すると、ps
コマンドが実行されたときにパスワードが表示されなくなります。ps -aux
が、同じコンピューター上の他のユーザーはを実行してパスワードを見ることができるため、通常はパスワードを入力してコマンドを実行しないでくださいps -aux
。他の回答で述べたように、実用的な場合は、代わりに公開鍵認証を使用することもできます。これにより、スクリプトから認証情報を分離できるため、心配することなくスクリプトを他のユーザーと共有し、後でスクリプトを暗号化せずに〜/ .sshフォルダーで暗号化を有効にすることができます。
sshpass
追加しました。
数か月間の質問の答えを探した後、私はようやくより良い解決策を見つけました。簡単なスクリプトを書くことです。
#!/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>
できた!
公開鍵認証を使用:https : //help.ubuntu.com/community/SSH/OpenSSH/Keys
ソースホストでこれを1回だけ実行します。
ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost
以上で、パスワードなしでsshを実行できるようになります。
expectsスクリプトを使用できます。しばらくは書いていませんが、以下のようになります。あなたはスクリプトを頭に置く必要があります#!/usr/bin/expect
#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:"
send "username\r"
expect "Password:"
send "password\r"
interact
/bin/myssh.sh: 2: spawn: not found /bin/myssh.sh: 3: expect: not found /bin/myssh.sh: 4: send: not found /bin/myssh.sh: 5: expect: not found /bin/myssh.sh: 6: send: not found
which expect
#!/usr/bin/env expect
interact
最後に追加したので、sshセッションは実際にインタラクティブです
バリアントI
sshpass -p PASSWORD ssh USER@SERVER
バリアントII
#!/usr/bin/expect -f
spawn ssh USERNAME@SERVER "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact
-p
フラグは、ポート番号を指定するためのものです。
SYNOPSIS sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
yum -y install epel-release
、次のことが必要ですyum -y install sshpass
すでに述べた素晴らしいsshpass
利点の1つは、で使用できることですautossh
。これにより、インタラクティブな非効率性がさらに排除されます。
sshpass -p mypassword autossh -M0 -t myusername@myserver.mydomain.com
これにより、たとえばラップトップを閉じることによってWi-Fiが中断された場合に自動再接続が可能になります。
-f
ので、この組み合わせでautosshにwhen used with autossh, ssh will be *unable* to ask for passwords or passphrases.
harding.motd.ca/autossh/README.txtはまたsuperuser.com/questions/1278583/...
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 $@"
# 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 "$@"
# clear the exported variable containing the password
unset SSHPASS
trap
ctrl-CがSSHPASS
変数をリークするのを防ぐために使用するスクリプトを更新
PreferredAuthentications=keyboard-interactive
がうまくいかないことを発見しました、しかしそれを取り替えることはうまくいきましたPreferredAuthentications=password
。
# 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 root@owned.com -p 22
参照:https : //www.linkedin.com/pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card
だれかがこれを提案しているのを見たとは思いません。OPは「スクリプト」とだけ言ったので...
私は同じ問題を解決する必要があり、私の最も快適な言語はPythonです。
paramikoライブラリを使用しました。さらに、を使用して権限をエスカレートする必要があるコマンドを発行する必要もありました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
からexpect
、これを思いつきました。
私はこれを次のように機能させました
.ssh / configはyes / noプロンプトを排除するように変更されました-私はファイアウォールの背後にいるので、なりすましのsshキーについて心配していません
host *
StrictHostKeyChecking no
expectの応答ファイル、つまりanswer.expectを作成します
set timeout 20
set node [lindex $argv 0]
spawn ssh root@node 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
新しい構成で更新された128個のhadoopデータノードを取得します-hadoop / confファイルにNFSマウントを使用していると想定します
これが誰かを助けてくれることを願っています-私はWindowsがとても好きで、これを理解するのに約5時間かかりました!
Windowsシステムでこれを行う場合は、Plink(PuTTYの一部)を使用できます。
plink your_username@yourhost -pw your_password
rootユーザーに変更するよりも、アカウントでのログインを含むより良い解決策があります。それはbashスクリプトです
http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/
@abbottoの答えは私にとってうまくいきませんでした、いくつか異なることをしなければなりませんでした:
私はそれでそれをうまく動かすことができました:
SSH_ASKPASS="echo \"my-pass-here\""
ssh -tt remotehost -l myusername
以下の例では、使用したソリューションを記述します。
シナリオ:shスクリプトを使用してサーバーからファイルをコピーしたい:
#!/usr/bin/expect
$PASSWORD=password
my_script=$(expect -c "spawn scp userName@server-name:path/file.txt /home/Amine/Bureau/trash/test/
expect \"password:\"
send \"$PASSWORD\r\"
expect \"#\"
send \"exit \r\"
")
echo "$my_script"
このスクリプトをスクリプト内で使用するには、最初の引数がホスト名で、2番目がパスワードになります。
#!/usr/bin/expect
set pass [lindex $argv 1]
set host [lindex $argv 0]
spawn ssh -t root@$host echo Hello
expect "*assword: "
send "$pass\n";
interact"
シェルスクリプトを介してリモートマシンに接続するには、以下のコマンドを使用します。
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS
ここでIPADDRESS
、USERNAME
およびPASSWORD
は、スクリプトで提供する必要がある入力値、または実行時に提供したい場合は、「読み取り」コマンドを使用します。
StrictHostKeyChecking=no
結果を説明せずに使用するように誰かに提案することは決してしないでください。