web-dev-qa-db-ja.com

パスワードでSSHログインを自動化する方法は?

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

例)

echo password | ssh id@server

これは機能しません。

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

462
Eonil

パスワードは使用しないでください。パスフレーズなしの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の使用を検討することもできます。

404
Cakemox
$ Sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
637
weekens

あなたの質問に対する正しい答えはsshpass詳細については他の答えを参照してください )ですが、より安全な方法があります-SSHキー。ソリューションから3つの簡単なステップです。

次のコマンドを入力して、rsa鍵ペアの生成を開始します。

# ssh-keygen

「キーを保存するファイルを入力してください」というメッセージが表示されたら、Enterキーを押してファイル名を空白のままにします。

端末からパスフレーズの入力を求められたら、これも空白のままにしてEnterキーを押します。

次に、1つの簡単なコマンドを使用して、キーペアをサーバーにコピーします。

# ssh-copy-id userid@hostname

これで、パスワードなしでログインできます:

# ssh userid@hostname
74
lzap

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
42
ooshro

UbuntuのPuTTY-toolsパッケージのplinkについて誰も言及していないことに驚いています。

plink user@domain -pw mypass  [cmd]

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

17
eadmaster

これは何の役にも立たないかもしれませんが、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! $!";
16
James L

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

sshpass

passwordが利用可能な唯一の認証方法である状況では、 sshpass を使用して自動的にパスワードを入力できます。 man pageSECURITY CONSIDERATIONSセクションに特に注意してください。 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では非常に扱いにくく、おそらくプログラミング言語の方が簡単です。パスワードが書き込まれる前に、別のプロセスがpipe/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

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

サイドノート

Bash HISTCONTROL変数ignorespaceまたは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回入力するだけで済むことです(より安全な入力方法を使用しても)。

12
nrolans

パスワードではなくSSHキーを使いたくないですか?そうすれば、安全かつ自動です。

8
Coops

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

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

4
Cameron Kerr

私はpasshを好む https://github.com/clarkwang/passh

sshpassは意図的に壊れています。

sshサーバーがknown_hostsにまだ追加されていない場合、sshpassはサーバーを既知のホストに追加するメッセージを表示しません。passhにはこの問題はありません。

リモートサーバーにログインします。

$ passh -p password ssh user@Host
1
Badr Elmers