私はbashを使った経験がありますが、チュートリアルで見た次のコマンドは私をパニックにさせました。
cat ~/.ssh/id_rsa.pub | ssh git@remote-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
私はこの命令が何をしているのかを知っています。ファイルの出力を取得して~/.ssh/id_rsa.pub
リモートssh
サーバーに送信し、ユーザーのホームディレクトリの下に.sshという新しいディレクトリを作成し、という名前の新しいファイルを作成し、そのファイルにauthorized_keys
内容をダンプします。id_rsa.pub
私が理解していないのは、この時点でファイルの内容id_rsa.pub
です注入認証キーファイルに入れます。
したがって、私はパイプ(|)が出力を左に送り、右のコマンドに供給することを知っています。ただし、通常は次のようにcatコマンドを使用します。
cat "content_to_be_added" >> file_to_be_appended
したがって、私の記憶が正しい場合は、id_rsa.pub
>>前に注入する必要があることを機能させるために存在することです。それでは、正確にどのように機能し、その理由は何ですか?
さて、私の用語を自由に修正してください。そしてここにオペレーターの具体的な名前があるかどうか教えてくれ>>
てありがとう。
答え1
注文する
cat >> ~/.ssh/authorized_keys
読み込むファイル名が指定されていないため、標準入力から読み込み、cat
指定したファイルに追加します。リダイレクト>>
演算子はターゲットファイルを開きます。追加。>
代わりにinを使用すると、>>
データを書き込む前にターゲットファイルが切り捨てられます(空になります)。
このリモートコマンドの標準入力データはどこcat
から来ましたか?標準入力ストリームはcat
リモートシェルから継承されます。リモートシェルは標準入力ストリームを継承しますssh
。標準入力は、ssh
パイプからファイルcat
を読み取るローカルコマンドに渡されます。~/.ssh/id_rsa.pub
cat
パイプラインにローカルは必要ありません。
ssh git@remote-server 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
ただし、mkdir
ディレクトリを作成する場合は、正しく機能するために正しい権限が必要ですssh
。
ssh git@remote-server 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
あるいは、データを追加しないように選択することもできます。
ssh git@remote-server 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
答え2
のcat
場合、ファイル名が指定されていない場合はstdinをstdoutにコピーします。
これを>>
出力リダイレクト演算子と呼びます。
ただcat >> filename
追加データは「filename」ファイルの標準入力から取得されます。
あなたの例では、cat "content_to_be_added"
「content_to_be_add」は実際には内容ではなく、入力ファイルの名前です。