パイプ、リダイレクト、およびリモート接続を含むシェルコマンドを理解するのに役立ちます。

パイプ、リダイレクト、およびリモート接続を含むシェルコマンドを理解するのに役立ちます。

私は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」は実際には内容ではなく、入力ファイルの名前です。

関連情報