公開鍵をsshサーバーにどのようにコピーしますか?


33

ここに私が試したものがあり、エラーが発生しました:

$ cat /home/tim/.ssh/id_rsa.pub | ssh tim@just.some.other.server 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory

なぜ2つのステップでそれをしないのですか?コピーしてから追加しますか?
ファヒムミタ

@FaheemMitha:うまくいきました、ありがとう!私は実際にトラブルの原因を理解するかもしれません。私の新しい投稿をご覧ください?
ティム

-fパラメータを使用すると、秘密鍵は必要ないので、誰かの公開鍵だけで鍵を渡すことができます!
クズカイ

回答:


67

OpenSSHには、これを行うためのコマンドが付属していますssh-copy-id。リモートアドレスを指定するだけで、公開鍵authorized_keysがリモートマシン上のファイルに追加されます。

$ ssh-copy-id tim@just.some.other.server

-iフラグを使用して、ローカルマシンで公開キーを見つける必要がある場合があります。

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server

1
ありがとう!コマンドが機能しないのはなぜですか?
ティム

@Tim この回答はそれを説明しました。>>シェルによって処理され、シェルではなくSSHを介してコマンドを実行しています。その後、あなたのコマンドを実行するシェルを実行するSSHを持つ彼の修正は、動作するはずです
マイケルMrozek

ありがとう!(1)ssh-copy-idも機能しません。ファイルをリモートに手動でコピーし、そのコンテンツを追加すると、動作します。これはなぜだろうか?サーバー上のデフォルトのシェルがスクリプトであり、元の投稿に更新していることがわかりました。これが理由かもしれません。ご覧ください。(2)ssh-copy-idは単に公開鍵をリモートにコピーするだけで、秘密鍵と公開鍵を作成しないのだろうか?
ティム

1
SSHサーバーが、認証メカニズムとして公開鍵認証のみを受け入れるように構成されていると仮定しましょう。その場合、使用ssh-copy-idは機能しませんよね?
Abdull

1
@Abdullそのマシンに接続する他のキーが既にある場合を除きます。SSHで接続しているだけです
マイケル・ムロゼック

31

あなたはいつもこのようなことをすることができます:

scp ~/.ssh/id_rsa.pub user@remote.example.com:/tmp/id_rsa.pub
ssh user@remote.example.com 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

catローカルマシンからsshセッションに移行できるかどうかはわかりません。提案されているように/ tmpに移動するだけです。

編集:これはまさにssh-copy-idそうです。マイケルが言ったように。


ありがとう!ssh-copy-idは単に公開鍵をリモートにコピーするだけなのでしょうか。秘密鍵と公開鍵は作成されませんか?
ティム

いいえ、作成しません。それを追加するだけです。
モンキー氏

@ Mr.Monkeyはい、パイプでデータをsshセッションに(catまたはそれ以外から)パイプできます。あなたが説明しているのは、昔ながらの方法です。ssh-copy-id入力ミスやファイルへの不正なアクセス許可のリスクが少ないため、推奨されます。
ジル 'SO-悪であるのをやめる

@Gilles、特にその操作のためにコンピューターを準備している場合、クライアントへのサーバーへのアクセスが常にあるとは限らないので、この方法は、機器を使用したり、設定する前にネットワークに接続してください。
e-info128

1
それともできるだけのパイプ先への直接cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'
パブロA

7

この回答では、質問に示されている意図した方法を機能させる方法について説明します。

リモートコンピューターでシェルを実行して、>>リダイレクト演算子の特別な意味を解釈できます。

ssh tim@just.some.other.server sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

>>通常、リダイレクト演算子はシェルによって解釈されます。

実行するssh host 'command >> file'command >> file、シェルによって解釈されることが保証されません。あなたの場合、特別な解釈なしにシェルの代わりcommand >> file実行され、引数としてコマンドに与えられました- シェルで実行するのと同じ方法です。>>command '>>' file

SSHの一部のバージョン(OpenSSH_5.9)は、リモートサーバーでシェルを自動的に呼び出し、シェル; > >>などによって解釈されるトークンを検出すると、コマンドをサーバーに渡します。


3

openssh提供しますssh-copy-id。シーケンスは次のとおりです。

  • 適切な4kキーを生成する

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • ssh-agentを起動しSSH_AGENT_PID、などの情報を取り込みます。

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • SSHエージェントへのキーのロードを開始します

    ssh-add ~/.ssh/id_rsa4k
    
  • ロードされていることを確認してください

    ssh-add -l
    ssh-add -L
    

    これにより、ssh-agentの内容が表示されます

  • 実際には、リモートシステムへのSSH

    ssh username@remotehost.network
    
  • これで、引数なしでssh-copy-idを実行できます。

    ssh-copy-id
    

    これにより~/.ssh/authorized_keys、ssh-agentに必要な基本情報が作成され、入力されます。


ところで、私はgithub.com/centic9/generate-and-send-ssh-keyで小さなスクリプトを作成しました。これらのステップのほとんどを一度に実行し、さらに通常は頭痛の種になるファイル/ディレクトリのアクセス許可を保証します...
centic

これは、パスワードログインが無効な場合に使用する優れた方法です。以前のキーで認証しながら新しいキーを追加できます。
MountainX

1

22以外のポートを選択するときにssh-copy-idで問題が発生しました...ここに、異なるssh-port(例:7572)を持つonelinerがあります:

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub

0

実際the ssh-copy-idコマンドはこれを正確に行いopenssh-clientます(パッケージから):

ssh-copy-id user@host

注:
hostIPアドレスまたはドメインを意味します


また、これにいくつかの追加情報を追加したいと思います

1)宛先サーバーのSSHに別のポート指定できます

ssh-copy-id "-p 8127 user@host"

注:ポートは、目の前になければならないか、それが解決されません。
user@host

ソース

2)ファイルを公開鍵で指定できます

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

注:
この-iオプションにより、公開キーを含むファイルで名前の適切な場所を示すことができます。

特に非標準の場所に保存したり、コンピューターに複数の公開キーがあり、特定のキーを指定したい場合に便利です。

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