パスワードを使用してSSHログインを自動化する方法


419

パスワードを使用してSSHログインを自動化する方法 テストVMを構成しているので、強力なセキュリティは考慮されません。最小限の構成で許容可能なセキュリティを確保するためにSSHが選択されました。

例)

echo password | ssh id@server

これは機能しません。

誰かが私を誘導したいくつかのトリックでこれをやったことを覚えていますが、今使ったトリックを思い出せません...


2
FreeBSDはパスワードなしのキーを受け入れませんでした。誘惑されないでください。ただし、一部のLinuxサーバーはそれを受け入れました。Linuxサーバーの設定が間違っていたと思います。
エオニル

16
これは有効な質問です。たとえば、ユーザーにパスワードの入力を許可し、それを使用して別のマシンにログインしたい。すべてのマシンにsshキーが配布されるとは思いません。これまでの以下の回答は、この状況を解決するものではありません。
dfrankow


非常に重要な質問です。私も答えが必要です。私のウェブスペースプロバイダーはサーバーにキーファイルを置くことをブロックしているので、キーファイルなしでパスワートを渡す必要があります。
ラドン8472

回答:


382

パスワードを使用しないでください。パスフレーズのないSSHキーを生成し、VMにプッシュします。

すでにSSHキーをお持ちの場合は、この手順をスキップできます… Enterキーと両方のパスフレーズを押してください:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

キーをターゲットサーバーにコピーします。

$ ssh-copy-id id@server
id@server's password: 

次に、を使用してマシンにログインしてssh 'id@server'、チェックインします。

.ssh/authorized_keys

予期しないキーが追加されていないことを確認してください。

最後にログインを確認してください…

$ ssh id@server

id@server:~$ 

またssh-agent、パスフレーズでキーを保護したい場合は、使用を検討することもできます。


14
キーペアを使用することにしました。それが最も簡単な方法だと気付いたからです。
エオニル

9
@Eonil:パスフレーズなしでキーを使用しようとしないでください。ssh-agentまたはpageantの使用方法を学びます。
user619714

119
これは良い答えですが、質問に対する正しい答えではありません。
ジョンハント

74
これらの種類の答えは本当に、本当に私を困らせます。それは問題ではありませんでした。キーペアの使用方法はだれも尋ねませんでした。
マットフレッチャー

16
これは質問に答えません。それは全く異なる質問に対する良い答えですが、尋ねられたものにとってはひどいものです。
srchulo

595
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname

51
うん、時にはさまざまな理由でキーベースの認証を使用できないことがあります。たとえば、今はpleskサーバーでkeyauthを使用できません。ボックスが有効になっていないため、rootがないためです。
ジョンハント

17
+1!補足として、RSAフィンガープリントを確認するために、をssh使用する前にプレーンを1回実行する必要がありますsshpass
-user123444555621

21
コマンドでパスワードを使用する必要がある場合は-1。これにより、パスワードが.bash_historyマシン上にプレーンテキストで記録されます。

15
@MisterDood history -rコマンドを実行すると、履歴を消去できます。良い点。
NuclearPeon

20
プロのヒント:.bash_historyに特定のコマンドを表示したくない場合は、コマンドの前にスペースを付けてください。それはただ動作します。ただし、このコマンドのユーザーは、システム上の非特権ユーザーがps(もちろんパスワードを含む)で完全なコマンドラインを表示できることをより懸念する必要があります。sshセッションは長持ちする傾向があるため、これはセキュリティの問題です。
CubicleSoft

71

質問に対する正しい答えはsshkeyですが、より安全な方法があります-SSHキー。ソリューションからわずか3つの簡単な手順です。

rsaキーペアを生成します

# ssh-keygen

次に、1つの簡単なコマンドでサーバーにコピーします。

# ssh-copy-id userid@hostname

パスワードなしでログインできます

# ssh userid@hostname

1
デフォルト値で正常に動作します。〜/ rsa4live.pubを使用することは、私が試みたときに機能しませんでしたssh-copy-id
シーズティマーマン

1
この手順を別のユーザーで機能させるには、1。ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
私にとってはssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
ガブリエルフェア

21
これは質問への答えではありません。
スティーブベネット

2
そして?答えは... sshpass、上記で
lzap

40

expectを使用します。

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

例:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost

2
動作しましたが、リモートマシンの標準出力を印刷できません。
エオニル

IPアドレスは毎回変更されるため、一部のマシンではキーを事前に配置できない場合に有効です。
ラリーカイ

4
それは追加して良いだろう-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullknown_hostsファイルにマシンを受け入れる避けるためにもsshコマンドのために
larrycai

B .. b but muh ssh keys ...
ダミアンÓCeallaigh

このスクリプトのより詳細な例は、あなたが見つけることができる: linuxaria.com/howto/... ここで、この例では、リモートコマンドで動作するはずすぎ
Radon8472

16

これはあなたにとって何の役にも立たないかもしれませんが、Perlでそれを行うことができます。

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";

2
同様に、このRubyを使用してgithub.com/net-ssh/net-ssh
EnabrenTane

15

Ubuntu plinkputty-toolsパッケージから誰も言及していないことに驚いています。

plink user@domain -pw mypass  [cmd]

Windowsでも使用でき、構文はopensshクライアントとほとんど互換性があります。


Windowsの場合、答えは良いです。通常、linux / unixユーザーは通常plinkを持っていません
Radon8472

2
putty-toolsパッケージに含まれています
eadmaster

10

SSHシングルサインオンは通常、公開キー認証と認証エージェントを使用して実現されます。テストVMキーを既存の認証エージェントに簡単に追加できます(以下の例を参照)。gssapi / kerberosなどの他のメソッドは存在しますが、より複雑です。

sshpass

password利用可能な認証方法が唯一の状況では、sshpassを使用してパスワードを自動的に入力できます。マニュアルページのセキュリティに関する考慮事項」セクションに特に注意してください。3つのオプションすべてで、パスワードはある時点で表示されるか、プレーンテキストで保存されます

匿名パイプ(sshpassが推奨)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

bashでは非常に扱いにくく、プログラミング言語では間違いなく簡単です。パスワードが書き込まれる前に、別のプロセスがパイプ/ fdにアタッチされる可能性があります。機会の窓は非常に短く、プロセスまたはルートに限定されます。

環境変数

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

あなたとrootは、sshpassの実行中(cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=)にプロセスの環境変数(つまりパスワード)を読み取ることができます。機会の窓はずっと長くなりますが、それでも他のユーザーではなく、自分のプロセスまたはルートに制限されます。

コマンドライン引数(最も安全性が低い)

 sshpass -p my_secret_password ssh user@host

これは便利ですが、マニュアルページで説明されているように安全性は低くなります。コマンドライン引数は、すべてのユーザーに表示されます(例:)ps -ef | grep sshpass。sshpassは引数を隠そうとしますが、すべてのユーザーが引数で渡されたパスワードを見ることができるウィンドウがまだあります。

サイドノート

bash HISTCONTROL変数ignorespaceorに設定し、ignoreboth機密コマンドの前にスペースを付けます。それらは履歴に保存されません。


SSH公開キー認証

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

パスフレーズは非常に重要です。なんらかの方法で秘密鍵ファイルを取得することは、パスフレーズなしでは使用できません。

SSH認証エージェントをセットアップする

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

通常通り接続する

ssh user@host

利点は、秘密鍵が暗号化され、パスフレーズを1回入力するだけで済むことです(より安全な入力方法でも)。


8

パスワードではなくSSHキーを使用したくないのですか?そのように、それは安全かつ自動の両方です。


3
パスワードなしでSSHキーを使用することは、ファイルでパスワードを使用するよりもわずかに安全です。
yunzen

10
@yunzen間違っています。キー認証は、ホストキーがわからなくても、mitm攻撃から保護します。攻撃者はサーバーになりすますことができますが、実際のサーバーに接続することはありません。パスワード認証を使用すると、接続するすべてのサーバー(正規または非正規)にパスワードが表示されます。これらの理由から、パスワードなしのsshキーは、パスワードをファイルに保存するよりもはるかに安全です。
カスペルド

14
これは答えではありません。
スティーブベネット

@SteveBennett受け入れられた回答と同じであり、それより前に投稿されましたが、詳細はあまりありません。
マイケルハンプトン

3
さて、受け入れられた答えは、尋ねられなかった質問に対するまともな答えだと思います。これは何でもありません。
スティーブベネット

4

自動化のニーズに応じて、おそらくAnsibleが適しています。パスワードのプロンプト、sudoパスワードのプロンプト、さまざまな使用方法の変更、暗号化されたシークレット(vault)の安全な使用などをうまく管理できます。

それが適切でない場合は、別の回答で示唆されているように、Expectをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.