
システムにSSHで接続している場合は、他の端末や画面セッションを開始してscpなどを実行したり、リモートシステムからローカルシステムにSSHを使用せずにファイルをローカルシステムにコピーしたりする方法はありますか?
答え1
主な接続
事前に計画を立てると、これが最も簡単です。
初めて基本接続を開きます。後続の接続の場合、スレーブ接続は既存のマスター接続を介してルーティングされます。あなたの~/.ssh/config
、接続共有設定が自動的に行われます。
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
既存の接続と同じ接続(ユーザー、ポート、コンピュータ)でSSHセッションを開始すると、2番目のセッションは最初のセッションを介してトンネルされます。 2番目の接続を確立するために新しい認証は必要なく、非常に高速です。
したがって、有効な接続があればすぐに次のことができます。
scp
ファイルを使用またはコピーしますrsync
。- sshfsを使用したリモートファイルシステムのマウント。
今後
既存の接続を介してリバースSSHトンネルを確立できます。 SSHコマンドラインでは、-R 22042:localhost:22
22042はリモートシステムの他のポート番号とは異なるランダムに選択された番号を転送してリモート転送を生成します。これにより、リモートコンピュータがssh -p 22042 localhost
元のコンピュータに再接続され、それを使用してscp -P 22042 foo localhost:
ファイルをコピーできます。
を使用してさらに自動化できますRemoteForward 22042 localhost:22
。問題は、複数のSSHインスタンスを使用して同じシステムに接続した場合、または他の人がそのポートを使用している場合は転送されないことです。
最初からリモート転送を有効にしていない場合は、既存のSSHセッションで実行できます。タイプEnter ~C
Enter -R 22042:localhost:22
Enter。詳細については、マニュアルの「エスケープ文字」を参照してください。
その中にも興味深い情報があります。このサーバー障害スレッド。
コピーして貼り付ける
ファイルが小さい場合は、それを入力してターミナル出力からコピーして貼り付けることができます。ファイルに印刷できない文字が含まれている場合は、次のようなものを使用してください。64ビットベース。
Remote.example.net$base64 <myfile (コピー出力)
local.example.net$base64 -d >myfile (クリップボードの内容を貼り付け) Ctrl+D
より便利には、X転送が有効になっている場合は、ファイルをリモートシステムにコピーしてローカルに貼り付けることです。データをパイプに入って出ることができます。xclip
またはxsel
。ファイル名とメタデータを保存するには、アーカイブをコピーして貼り付けます。
remote.example.net$ tar -czf - myfile | xsel
local.example.net$ xsel | tar -xzf -
答え2
答え3
~
SSHはエスケープ文字を介していくつかのコマンドをサポートします(デフォルトでは):
$ ~?
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
$ ~C
ssh> help
Commands:
-L[bind_address:]port:host:hostport Request local forward
-R[bind_address:]port:host:hostport Request remote forward
-D[bind_address:]port Request dynamic forward
-KR[bind_address:]port Cancel remote forward
!args Execute local command
これは!args
あなたが望むものに最も近いようです。これらのコマンドがPermitLocalCommand
機能する/etc/ssh_config
には、ファイルでこれらのコマンドを有効にする必要があります~C
(参考資料を参照man ssh_config
)。
ControlMaster
設定すると、同じSSHセッションを再利用できますssh_config
。これにより:
$ ~C
ssh> !scp file user@myserver:
技術的にはSSHセッションを終了せず、再認証する必要もありません。おそらくあなたが望むものよりも複雑です。しかし、他の簡単な方法は思い出されません。
答え4
- 使用SSH-xfer、ファイル転送のために既存のSSH側チャネルを効果的にオーバーロードする修正されたSSHエージェント。
- 使用税、実際にはssh経由のzmodemです。 rzszを使ったことがあるとしたら、とてもおなじみのようです。
- もう一方の端でリッスンするいくつかのファイル転送デーモンがあるとし、逆方向(、リモート
-R
からローカルへ)または転送(、ローカルからリモートへ)ポートでファイル転送を実行します。-L
しかし、私の考えでは、これらのどれも実際には必要ありません。 SSHプロトコルは単一の接続で複数のチャネルをサポートし、OpenSSHクライアントは多重化をサポートします。あなたが持っていると仮定ControlMaster
してControlPath
設定(ControlPersist
また便利)、
#最初の接続 $SSHリモート #元のSSHによって開かれた同じ接続で多重化されます。 $SFTPリモート