
私たちは意図的に次のスイッチを使ってOpenSSHを構築します:--with-default-path
空白。サーバーにバイナリが含まれないようにOpenSSHを展開しようとしていますscp
。
scp
ローカルコンピュータ(クライアント)からリモートコンピュータ(サーバー)に移動しようとすると、次のメッセージが表示されます。
scpコマンドが見つかりません
サーバーは、scp
バイナリが両方(クライアントとサーバー)に存在すると予想しているようです。それでは、scp
なぜリモートサイドバイナリが必要なのでしょうか?ただローカルマシン(クライアント)に置くだけでは十分ではないですか?誰かがこれを明確にすることができますか?
メモ:scp
コピーしたいファイルがリモートサーバーにない場合は、リモート(サーバー)で次のエラーが発生します。
scpコマンドが見つかりません
答え1
scp
私はあなたの質問に答えたと思います。両方が必要です。
ローカルインスタンスは、リモートコールの文書scp
化されていないフラグを使用してファイル転送プロトコルを処理します。scp
-t
実際にはそうではありませんが、サーバーがscp
ある場合はそれを使用してファイルを転送できます。ほとんどの場合、SFTPサーバーコンポーネントがサーバーに組み込まれているためです。ssh
sftp
ssh
答え2
全長DR
SSHプロトコルは、ファイルコピーが1つの複数の重複する「サービス」を容易にします。 SSHプロトコルがこれを行う方法は、クライアントがscp -t
コマンドラインツールを使用してサーバーに接続すると、サーバー上の子プロセスとして起動されることです。scp
SSHがインストールされているすべてのサーバーには、SSHのすべての「サービス」(ssh
、、、scp
)sftp
を提供するための完全なCLIツールが必要です。ディスク上のこの場所は管理サーバーデーモンにのみ必要ですsshd
。これは、クライアントがどこにでも配置でき、クライアントが知らないか知る必要があり、sshd
TCPポート(通常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
次に、ssh
Raspberry 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
接続が機能するメカニズムを示す図があります。
上の画像でscp <file> <server>:/<path>
コマンドを実行すると、クライアント側で次のように変換されることがわかります。
/usr/bin/ssh -x -oForwardAgent=no -oPermitLocalCommand=no -oClearAllForwardings=yes - ファイホール scp -t /tmp/。
この場合、クライアント(scp
)はsshd
クライアントのデーモンにサーバーに要求を送信し、リモートsshd
側から開始するように指示します。scp -t /tmp
ドキュメントによると、これはscp
SSHトンネリングを使用するように設計された方法です。
追加の洞察
私はいくつかの実験をしてバイナリをコピーしてscp
クライアントmyscp
で実行しました。各場合、/usr/bin/ssh ...
コマンドは引き続き表示されます-- someserver scp -t /tmp/.
。
これにより、コマンドを実行するときにクライアントが参照してscp
も、実行可能ファイルの名前がクライアントに直接渡されないと考えられます。代わりに、デーモンはサポートするさまざまなクライアントツールの名前をハードコードしています。scp
ssh
sshd
これは上記の詳細でさらに確認されます。
結論として
--with-default-path
コンパイル時に定義を完全に削除/無効にすることは不可能ですsshd
。完全に削除すると、sshd
接続がトリガーされたscp -t <dir>
時点を見つける機能が損なわれます。scp
これを分離する最善の方法sshd
は、OpenSSHを構成するさまざまなバイナリのみを含むディレクトリを指定することです。
引用する
答え3
明らかにこれを使用するには、両方のインスタンスにプロトコルが必要です。代替案が必要な場合は、次のようにsshを使用できます。
ssh user@ip "cat > destination" < file.txt