sshサーバーにログインするためのシェルスクリプト


29

スクリプトに記載されているパスワードを使用してsshサーバーに自動ログインできるシェルスクリプトを作成してみました。私は次のコードを書きました:

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

このコードは適切に実行されていませんが、それでもパスワードを要求しています。誰かがこれを解決するのを助けてくれますか



回答:


36

私はかつてexpectsshサーバーにログインするスクリプトを書いて(あなたの場合のように)、私のスクリプトは次のようなものでした:

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

おそらくinteractスクリプトに欠けていると思います。


これは私にとって絶対にうまく機能しており、私はこの場所で立ち往生しています、対話は対話型のターミナルにプロンプ​​トを提供しますが、doのようなさらに多くのステップを自動化し、ファイルの内容も読み込もうcdlsしています。やり取り後に行うことは可能ですか?返信してください
Hansiemithun

@Hansie lsログイン後にコマンドを送信できます。たとえば、パスワードを送信した後expect、コマンドプロンプトテキストで(ログインしていることを確認するため)を実行し、次にを実行しsend "ls\r"ます。これらはすべて前に進みinteractます。
saeedn

質問は少し間違っていて、lsをして内容を読んだ後、申し訳ありませんが、同じものを印刷することができます。しかし、それをsshセッションから変数に入れてローカルマシンからアクセスする方法。参照:stackoverflow.com/questions/32341234/expect-script-return-value。しかし、出力は私のために機能していません。私の質問は投稿:stackoverflow.com/questions/51628465/...をfile_list終了後にローカルコマンドプロンプトからアクセスする必要があります
Hansiemithun

31

あなたはそれについて間違った方法で行っています。あなたがしたいのは、パスワードなしのssh-keyペアを生成し、(サーバーがRSAキー認証をサポートしている限り)すべてのパスワードを入力せずに取得できることです。秘密鍵が盗まれそうな場所に保存されている場合、これはセキュリティ上のリスクです。

次の手順を実行します:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. Returnパスフレーズを求められたら押します
  5. もう一度押しReturnて確認します。

今そこにあなたの内の2つのファイルになります~/.sshディレクトリ、mysshkey.pubおよびmysshkeymysshkey.pubは公開鍵です。これはリモートサーバーに置いても安全です。mysshkeyパスワードなしのプライベートキーです。リモートサーバー(または他の誰かがコピーを取得できる場所)に置くことは安全ではありません

SSHを実行するサーバー上で:

  1. リモートサーバーにログインする
  2. mkdir -p ~/.ssh
  3. コピーとの内容貼り付けるmysshkey.pubには~/.ssh/authorized_keys
  4. それがいることを確認し~/.ssh/authorized_keysているchmod「Dへ600

ローカルマシンで実行するには、次のコマンドを実行します。

ssh -i ~/.ssh/mysshkey <remote_server_ip>

そして、パスワードの入力を求められることなくログインします。

これは、パスワードを変更した場合に更新する必要のある複数の場所をパスワードでハードコーディングする必要がないため、自動ログインを管理するための非常に望ましい方法です。


2
DSAではなくRSAキーを使用します。しかし、それ以外は完全に同意します。
glglgl

12
ネットワークアプライアンスなど、リモートホストにキーを追加できない場合があります。
-DarkHeart

1
これを試してみました。sshはまだパスワードを要求しています。特にIPアドレスを指定する必要がありますか?<user> @ <domain-name>とドメイン名の両方で試しました。
ジェイ・ビエン

このコマンドはあまりにも多くの引数を言った?(ステップ3)
ジョセフアストラハン

ssh-keygen -t dsaに変更し、代わりにファイルの場所を手動で入力する必要がありました。
ジョセフアストラハン

20

Debianベースのディストリビューションでは、このsshpassパッケージにより、目的の作業を簡単に行うことができます。このパッケージは、他の多くの一般的なディストリビューションで利用できます。最初に設定する必要があります。

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

次に、次のようなスクリプトからSSHコマンドを呼び出します。

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

これにより、を使用するソリューションよりも、異なるロケールを使用している場合やパスワードを変更する必要がある場合など、柔軟性が向上しますexpect


7

最初にsshPassをインストールします sudo apt-get install sshpass

次に、.bashrcファイルにエイリアスを作成します

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

変更した.bashrcファイルをリロードします source ~/.bashrc

これで完了です。

これsshLoginで、ターミナルで上記で作成したエイリアスを使用してsshを実行できます。



2

ハッシュキーを作成してPCに保存するために必要なものすべて

入力するだけ

ssh-keygen -t rsa -b 4096 # just press Enter till the end

入って

ssh-copy-id <user>@<server>

次に通常を使用してログインします

ssh <user>@<server>

今、あなたはパスワードを必要としません

注:パスワードをプレーンテキストで保存するのは危険です

この方法は、非常に安全なRSAを使用して長さ4096の公開キーでパスワードのハッシュ値を作成します。


1
これはこの答えの繰り返しのようです。
ロアイマ

#roaimaはい、しかしそれはssh-copy-id他の誰も言及しなかった信じられないほど有用なコマンドを提案します。そのために賛成です。
Huw Walters

1

5つの簡単な手順でSSH Keygenを使用したSSHパスワードレスログイン

環境設定: ここに画像の説明を入力してください

手順1: SSH-Kegenキーの認証-(192.168.0.12)
最初にユーザーでサーバー192.168.0.12にログインし、次のコマンドを使用して公開キーのペアを生成します。

ここに画像の説明を入力してください

ステップ2: .sshディレクトリを作成します– 192.168.0.11
次のコマンドを使用して、サーバー192.168.0.12からSSHを使用してサーバー192.168.0.11を接続し、その下に.sshディレクトリを作成します。

ここに画像の説明を入力してください

手順3: 生成された公開キーを– 192.168.0.11に
アップロードするサーバー192.168.0.12からSSHを使用し、ユーザーの.sshディレクトリの下にあるサーバー192.168.0.11の新しい生成された公開キー(id_rsa.pub)をファイル名authorized_keysとしてアップロードします。

ここに画像の説明を入力してください

ステップ4: 許可を設定する-192.168.0.11
サーバー上のSSHバージョンが異なるため、.sshディレクトリとauthorized_keysファイルに許可を設定する必要があります。

ここに画像の説明を入力してください

ステップ5: パスワードなしの192.168.0.12から192.168.0.11サーバーへのログイン
これから、パスワードなしのtecmintユーザーとしてサーバー192.168.0.12からsheenaユーザーとして192.168.0.11にログインできます。

ここに画像の説明を入力してください


おかげで...これは私にとってはうまくいきましたが、ステップ4で劇的な「警告」が出ました:「保護されていないプライベートキーファイル!... ... /。ssh / id_rsa」が開きすぎています。無視されました...不正な許可」。私がやったchmod 700 id_rsa問題が解決:ローカル(クライアント、つまり192.168.0.12あなたの例では)サーバーのディレクトリの.sshに
マイクげっ歯類


1

他の回答で既に説明したように、私も使用しますが、一時的な環境変数にパスワードを保存sshpassするreadコマンドと組み合わせます。このようにして、パスワードがどこにも明確に書き込まれることはありません。これが私が使用する1行のコマンドです。

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

その後、パスワードを入力する必要があり(画面には何も表示されません)、Enterキーを押すと接続が開きます。


0

私は最近これをしました、これはあなたを助けるかもしれません:

sshpass -p 'password' username@ipaddress

これが機能しない場合は、接続する他のマシンでキーを生成する必要があります

ssh-keygen

秘密鍵と公開鍵を生成して場所を尋ね、空のままにすると、デフォルトで.sshフォルダーに鍵が保存されます。パスフレーズを尋ねます。また、.sshフォルダーに移動して空のままにして、 「authorized_keys」への公開鍵名

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

これにより、リストにユーザーが追加され、ホームディレクトリに移動して許可を与え、sshdサービスを再起動します。

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

ここで、sshコマンドを実行する場所からその場所にあるシステムに秘密鍵を移動する必要があります。

sshpass -p 'password' ssh -i id_rsa username@ip

それでもうまくいかない場合は、/ etc / sshでsshd_configをvimエディターで開き、pubkeyAuthenticatoinがyesになっているかどうかを確認し、yesに変更しない場合は、sshdサービスを再起動してから試してください。 。


0

最初の引数はホスト名で、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

実行:./script.expect

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