`scp`クライアント - >サーバーを実行すると(サーバー上)scpコマンドが見つかりません。なぜですか?

`scp`クライアント - >サーバーを実行すると(サーバー上)scpコマンドが見つかりません。なぜですか?

私たちは意図的に次のスイッチを使ってOpenSSHを構築します:--with-default-path空白。サーバーにバイナリが含まれないようにOpenSSHを展開しようとしていますscp

scpローカルコンピュータ(クライアント)からリモートコンピュータ(サーバー)に移動しようとすると、次のメッセージが表示されます。

scpコマンドが見つかりません

サーバーは、scpバイナリが両方(クライアントとサーバー)に存在すると予想しているようです。それでは、scpなぜリモートサイドバイナリが必要なのでしょうか?ただローカルマシン(クライアント)に置くだけでは十分ではないですか?誰かがこれを明確にすることができますか?

メモ:scpコピーしたいファイルがリモートサーバーにない場合は、リモート(サーバー)で次のエラーが発生します。

scpコマンドが見つかりません

答え1

scp私はあなたの質問に答えたと思います。両方が必要です。

ローカルインスタンスは、リモートコールの文書scp化されていないフラグを使用してファイル転送プロトコルを処理します。scp-t

実際にはそうではありませんが、サーバーがscpある場合はそれを使用してファイルを転送できます。ほとんどの場合、SFTPサーバーコンポーネントがサーバーに組み込まれているためです。sshsftpssh

答え2

全長DR

SSHプロトコルは、ファイルコピーが1つの複数の重複する「サービス」を容易にします。 SSHプロトコルがこれを行う方法は、クライアントがscp -tコマンドラインツールを使用してサーバーに接続すると、サーバー上の子プロセスとして起動されることです。scp

SSHがインストールされているすべてのサーバーには、SSHのすべての「サービス」(ssh、、、scpsftpを提供するための完全なCLIツールが必要です。ディスク上のこの場所は管理サーバーデーモンにのみ必要ですsshd。これは、クライアントがどこにでも配置でき、クライアントが知らないか知る必要があり、sshdTCPポート(通常22)を介してのみクライアント/サーバーとして通信することを意味します。


背景

scpそのようなrsyncアプリケーションはsshそれ自体がクライアント/サーバーアプリケーションです。つまり、クライアントアプリケーションscpとサーバーアプリケーションが必要です。この場合はscp両方です。

これは例です

$ scp /Users/user1/thumbnails-digikam.db pi-hole:/tmp/.
thumbnails-digikam.db                                                                                                                                   0%    0     0.0KB/s   --:-- ETA^Z
[1]+  Stopped                 scp /Users/sammingolelli/thumbnails-digikam.db pi-hole:/tmp/.

ラップトップからRaspberry Piサーバー(パイホール)から起動し、+scp途中で一時停止しました。CtrlZ

次に、sshRaspberry Piサーバーに移動して次の操作を行いますps

$ ps -eaf | grep [s]cp
pi        9688  6147  0 11:11 ?        00:00:00 scp -t /tmp/.

アプリケーションサーバーがscp実行中で、ファイルが/tmpディレクトリに書き込まれていることがわかります。一時停止したファイルが次の場所にも記録されていることを確認できます。

ラズベリーパイ(サーバー)
$ ls -l /tmp/thumbnails-digikam.db
-rw-r--r-- 1 pi pi 2260992 Jul  6 11:12 /tmp/thumbnails-digikam.db
ノートブック(クライアント)
$ ls -l ~/thumbnails-digikam.db
-rw-r--r--  1 user1  staff  38551552 Jun  4 00:47 /Users/user1/thumbnails-digikam.db

scpラップトップ(クライアント)で一時停止を解除して続行する場合:

$ fg
scp /Users/user1/thumbnails-digikam.db pi-hole:/tmp/.
thumbnails-digikam.db
$

完了してRaspberry Pi(サーバー)を見直すと、アプリケーションがscp実行されなくなったことがわかります。

$ ps -eaf|grep [s]cp
$

OpenSSHは、特定の操作中に必要な場合にのみサーバーアプリケーション(デーモン)を起動し、転送が完了すると終了するという点で多少ユニークです。

これを容易にする元のデーモンはssh次のデーモンです。

$ ps auxf | less
...
root      6132  0.0  0.6  11524  5812 ?        Ss   02:53   0:00  \_ sshd: pi [priv]
pi        6147  0.0  0.4  11812  4016 ?        S    02:53   0:03      \_ sshd: pi@pts/0
pi        6150  0.0  0.4   6172  4036 pts/0    Ss   02:53   0:00          \_ -bash
root      6172  0.0  0.3   7232  3336 pts/0    S    02:53   0:00          |   \_ sudo -Es
root      6176  0.0  0.4   6120  4180 pts/0    S    02:53   0:00          |       \_ /bin/bash
root      9772  0.0  0.3   7888  3076 pts/0    R+   11:20   0:00          |           \_ ps auxf
root      9773  0.0  0.0   3800   480 pts/0    S+   11:20   0:00          |           \_ less
pi        9745  0.2  0.1   3988  1872 ?        Ss   11:19   0:00          \_ scp -t /tmp/.
...

scp子プロセスである上位/下位階層に注意してくださいssh

scp会話プロファイリング

見たらオライリーSSHブックscp接続が機能するメカニズムを示す図があります。

                SS1

上の画像でscp <file> <server>:/<path>コマンドを実行すると、クライアント側で次のように変換されることがわかります。

/usr/bin/ssh -x -oForwardAgent=no -oPermitLocalCommand=no -oClearAllForwardings=yes - ファイホール scp -t /tmp/。

この場合、クライアント(scp)はsshdクライアントのデーモンにサーバーに要求を送信し、リモートsshd側から開始するように指示します。scp -t /tmp

ドキュメントによると、これはscpSSHトンネリングを使用するように設計された方法です。

         SS2

追加の洞察

私はいくつかの実験をしてバイナリをコピーしてscpクライアントmyscpで実行しました。各場合、/usr/bin/ssh ...コマンドは引き続き表示されます-- someserver scp -t /tmp/.

これにより、コマンドを実行するときにクライアントが参照してscpも、実行可能ファイルの名前がクライアントに直接渡されないと考えられます。代わりに、デーモンはサポートするさまざまなクライアントツールの名前をハードコードしています。scpsshsshd

これは上記の詳細でさらに確認されます。

結論として

--with-default-pathコンパイル時に定義を完全に削除/無効にすることは不可能ですsshd。完全に削除すると、sshd接続がトリガーされたscp -t <dir>時点を見つける機能が損なわれます。scp

これを分離する最善の方法sshdは、OpenSSHを構成するさまざまなバイナリのみを含むディレクトリを指定することです。

引用する

答え3

明らかにこれを使用するには、両方のインスタンスにプロトコルが必要です。代替案が必要な場合は、次のようにsshを使用できます。

ssh user@ip "cat > destination" < file.txt

関連情報