1行でSSHする方法


26

SSHを介して1行で別のコンピューターに接続するにはどうすればよいですか?もしそうするならssh host@IP、2行目にパスワードを入力する必要があります。私は次のようなことができると考えていました:ssh host@IP | echo password、それはパスワードを要求する前にパスワードを入力します。


3
この種の考え方は、インターネットがより安全な場所であったtelnetと期待の時代から来ています。アレンの答えは正しい、Jakujeの答えは技術的には正しいが、ほとんどの場所での仕事のためのツールではない。
クリギー

3
これは、パスワードなしのログインを設定するための良い質問です。受け入れられた答えを再訪するようお願いします。どのJakujeの答えが-正しい-と-動作します、これを行うための適切な方法は、アランの答えに記載されているSSHキーを使用することです。
スコットランド

sshstdinからパスワードを読み取れば機能しますecho password | ssh host@IPが、通常、SSHは端末から直接読み取ろうとします。
パエロエベルマン

回答:


82

パスワードは非常に安全ではないため、コマンドラインにパスワードを入力するのではなく、SSHキーを使用して認証する必要があります。

これが機能する方法は、SSHキーをセットアップしたら、コマンドを発行するだけです。

ssh user@host

別のものを入力しなくても、自動的にログインされます。


macOSからSSH公開キーをMac / FreeBSD / Linuxにコピーする

これは、パスワードベースの認証(パスワードの入力)を介してリモートサーバーにアクセスできること、およびプライベート/パブリックキーペアを既に生成していることを前提としています(ない場合は、以下を参照)。次の例では、RSAを使用しています。まず、キーをコピーします(macOS、Linux、BSDなどで「ホーム」ディレクトリが異なることに注意してください)。

SCPの使用:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

または、単にファイルをcat-catingしますauthorized_keys(私はこの方法を好みます):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(キー名は異なる場合があります).sshディレクトリがリモートサーバーに存在しない場合は、ログインして作成する必要があります。

これで、キーがMacからリモートサーバーにコピーされました。リモートサーバー上のSSH公開キーに正しいアクセス許可を設定します。

chmod 600  ~/.ssh/id_rsa.pub

次に、SSH authorized_keysファイルにキーを追加します(ファイルが存在しない場合は作成します)。

ファイルがauthorized_keys既に存在する場合は~/.ssh、次のコマンドを使用します。

cat id_rsa.pub >> authorized_keys

ファイルが存在しない場合は、次のコマンドを入力します。

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


macOSでSSH公開/秘密キーを生成する

アプリケーション->ユーティリティ->ターミナルに移動してターミナルを開きます

ターミナルで、次のコマンドを使用してキー生成を開始します

ssh-keygen -t rsa

次に、秘密鍵ファイルを作成する場所を指定するよう求められます。

キーを保存するファイルを入力します(/Users/username/.ssh/id_rsa):

これを空のままにして、デフォルトの場所にあるキーを作成します/Users/username/.ssh/id_rsa。公開鍵ファイルは、同じ名前で同じ場所に作成されますが、拡張子は.PUBです。

パスフレーズを選択するように求められたら。これは、秘密鍵を使用するためのオプションのパスワードです

Enter passphrase (empty for no passphrase):

SSHキーが生成されます。

パスフレーズを入力すると、接続するたびにパスフレーズを入力する必要があります。ユーティリティssh-agentはパスフレーズをメモリに保持するので、同じセッション中に接続するたびにパスフレーズを手動で入力する必要がなくなります。詳細についてはman ssh-agent


6
絶対にこれ-キーは、インターネットを介したsshアクセスのパスワードを完全に置き換えることができます。秘密鍵のセキュリティの必要性を拡大することをお勧めします。秘密鍵は、すべてのコンピューターに関係するものではありません。
クリギー

+1これは、それが言うことだけでなく、あなたがそれをどのように説明したかのためにも、本当に良い答えです。私の本では、ユーザーがフォローしやすく、安全性を高めるのに役立つものはすべてプラスです!
Monomeeth

7
素晴らしい答え。追加したかったのssh-copy-idは、上記のいくつかを自動化するための素晴らしいツールです。
スコットランド

ssh-agentの言及も役立つかもしれません。OS X / macOSのほとんど(すべて?)のバージョンに付属しており、キーがパスワードで保護されている場合でもパスワードなしでログインできます。
Qsigma

1
@Scot-デフォルトではmacOSの一部ではないため、HomebrewまたはMacPorts経由インストールする必要があります。私はソフトウェアをインストールするのが好きではありません。1行で書けることもあれば、短い自作のスクリプトを書くこともできます。そのため、答えの範囲外だと思いました。ただし、これは小さなユーティリティであり、言及する価値があります。
アラン

13

いくつかの可能性があります。あなたの例は明らかに動作しませんが、sshpassユーティリティを使用して同様のことを達成できます:

sshpass -p password ssh host@IP

注、これは推奨されませんので、password他のプロセスやシェル履歴に表示されます。

同じことを行うより良い方法は、SSHキーを使用してパスワードなしの認証をセットアップすることです。要するに:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP

sshpass推奨どおりに試しましたが、コマンドが見つからないというメッセージが表示されました。
ベンA.

8
まあ...あなたはおそらくそれをインストールする必要があります。いいえ、お勧めしません。SSHキーを使用してパスワードなしの認証を設定します。
-Jakuje

4
@BenA。パブリック/プライベートキーパッドを定義し、関係する両方のマシンでセットアップすることにより、パスワードレス認証をセットアップします。これは、任意のパスワードよりもはるかに簡単(と、実際に安全)だ
nohillside

8
千回 sshpassは、sshを話すがキーを適切に行わないデバイスに接続するために使用されるダーティハックであり、その主な用途はセットアップスクリプトです。マルチユーザーマシンでsshpassを使用しないで、 ps auxw | grep sshpass 他のユーザーにsshパスワードを通知します。
クリギー

1
@Criggie、完全にではありません。私はキーベースのソリューションに100%遅れていますが、内部専用のRaspberry Piでsshpassを使用しています(ランダムタスク、ランダムクライアントによるアクセス、内部使用のためだけにキーを渡すのは面倒です)。コマンドを実行すると、次の出力が得られますpi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh pi@192.168.0.208zzzzzzzzリテラルです。sshpassはパスワードの内容をマスクします。おそらく以前のイテレーションはプライバシーを意識していなかったでしょう。
フリス

3

私もこれに対する答えを探すのに長い時間を費やしました。安全ではなく、これらすべての人がRSAキー(より安全で信頼性の高いアイデアです)を使用するように言っているにもかかわらず、かなり可能です。

expectこのために呼び出されたプログラムを使用してください。Expectは、標準出力(および正しく構成されている場合は標準エラー出力)を監視し、特定のメッセージを待って出力で応答します。Expect自体は実際にはスクリプト言語であり、これと同じことを行っていたとき、タイミングのために自分のスクリプトを適切に動作させるのに非常に苦労しました。ただし、expectにはと呼ばれる便利なユーティリティも含まれていますautoexpect

autoexpectでは、ユーザーを監視し、expectスクリプトを生成します。autoexpectと必要なコマンドを実行するだけです:

autoexpect ssh host@ip 

そして、あなたが通常することをします。(exitssh'dシェルに入力して)プログラムを終了すると、スクリプトが生成されます。記述しているスクリプト全体を予期スクリプトに入れたくない場合はscript.expexitコマンドをシェルに入力する前に、autoexpectからスクリプトを編集して終了できます。スクリプトの末尾を変更するために移動する行は次のとおりです。

expect eof

これはファイルの終わりを予期することを意味します。お役に立てれば!


1
誰もまだ言っていない場合:Ask Differentへようこそ!
-Synoli

2

使用expectは、テストスイート以外でssh接続にログインするのは明らかに間違っています。

@ ben-aが探しているものは、すでにsshに実装されています。使い方はコツです。だからここに行きます:

  1. を使用して公開/秘密キーペアを生成しssh-keygenます。ECDSAまたはRSAのいずれかを-t(またはタイプ)として使用し、RSAの場合は2048または4096を-b(またはBITSの長さ)として使用します。執筆時点ではこれで十分です。常にパスワードを使用してください!
  2. ssh-copy-id上記の方法論を利用して、ログオンしているマシン(サーバー)に~/.ssh/authorized_keysファイルを作成します。生成したばかりの公開鍵のコピーがあります。
  3. これで、「サーバー」(またはクライアント)へのログインに使用するマシンで、ファイルを開きます~/.ssh/config。存在しない場合は作成できます。
  4. このファイルでは、必要に応じて以下を追加します

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. ssh <name>接続をセットアップするためだけに使用できるようになりましたが、キーのパスワードが必要です。これを解決するには、この目的のために開発および組み込まれたssh-agentを使用します。キーをエージェントに追加するには、を使用しますssh-add <path to keyfile>。パスワードの入力を求められ、このセッションのキーが安全に保存されます。「ssh-agentが見つかりません」(または同様の)エラーが発生した場合、おそらくエージェントが起動されていないことを意味します。を使用して、このセッションで開始できssh-agent bashます。これにより、エージェントがアクティブな状態で新しいシェルが開始されます。

これらの手順を使用すると、資格情報をハイジャックすることで誰かになりすますのを難しくするだけでなく、使いやすさを維持できます(プレーンパスワードよりも使いやすくなります)。

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