14

ssh経由でリモートホストに接続する場合、そのシステム上のファイルをローカルシステムに持ってきて、表示または処理したいことがよくあります。(a)新しい端末を開く/ sshセッションを一時停止することなく(b)ローカルホストまたはリモートホストのいずれかに対して再度認証することなくファイルをコピーする方法はありますか(c)ホストの一方または両方が背後にある場合でもNATルーター?

目標は、現在の状態を可能な限り活用することです。つまり、2つのマシン間に接続があり、両方で認証されていること、ファイルの作業ディレクトリにいることです。別の端末を開いて、リモートホストとパスをコピーして貼り付ける必要はありません。これは、私が今行っていることです。最善の解決策は、セッション開始前にセットアップを必要としないこともありますが、セットアップが1回限りであるか、自動化できる場合は、それで十分です。

4

11 に答える 11

9

zssh (openssh のZMODEMラッパー) はまさにあなたが望むことを行います。

  • zsshをインストールして、openssh の代わりに使用します (通常はこれを使用すると想定しています)。

  • 両方のシステムにlrzszパッケージをインストールする必要があります。

次に、ファイルzyxel.pngをリモート ホストからローカル ホストに転送するには、次のようにします。

antti@local:~$ zssh remote
Press ^@ (C-Space) to enter file transfer mode, then ? for help
...
antti@remote:~$ sz zyxel.png
**B00000000000000
^@
zssh > rz
Receiving: zyxel.png
Bytes received:  104036/ 104036   BPS:16059729

Transfer complete
antti@remote:~$ 

アップロードも同様ですが、rz(1)sz(1 ) を切り替えるだけです。

Putty ユーザーは、同様の機能を持つLe Puttyを試すことができます。

于 2008-09-08T15:45:44.060 に答える
4

Linux ボックスでは、ssh-agent と sshfs を使用します。キーペアを使用した接続を受け入れるように sshd をセットアップする必要があります。次に、ssh-add を使用してキーを ssh-agent に追加し、毎回パスワードを入力する必要がないようにします。必ず -t 秒を使用して、キーが永久にロードされたままにならないようにしてください。
ssh-add -t 3600 /home/user/.ssh/ssh_dsa

その後、
sshfs hostname:/ /PathToMountTo/
によってサーバー ファイル システムがマシンにマウントされ、アクセスできるようになります。

個人的には、自分のキーを追加し、最も頻繁に使用するサーバーをマウントする小さな bash スクリプトを作成したので、作業を開始するときは、スクリプトを起動してパスフレーズを入力するだけです。

于 2008-09-08T15:37:06.140 に答える
3

openssh 実装のあまり知られていない、ほとんど使用されていない機能を使用して、目的を正確に達成できます。

  • 現状を活かしている
  • 現在の作業ディレクトリを使用できます
  • セッション開始前のトンネリング設定は不要
  • 別の端末や接続を開く必要はありません
  • インタラクティブ セッションで 1 回限りの取引として使用することも、自動化されたセッションの一部として使用することもできます

local>以下の例の、remote>、および ssh>プロンプトのそれぞれにあるものだけを入力してください。

local> ssh username@remote
remote> ~C
ssh> -L6666:localhost:6666
remote> nc -l 6666 < /etc/passwd
remote> ~^Z
[suspend ssh]
[1]+  Stopped                 ssh username@remote
local> (sleep 1; nc localhost 6666 > /tmp/file) & fg
[2] 17357
ssh username@remote
remote> exit
[2]-  Done                    ( sleep 1; nc localhost 6666 > /tmp/file )
local> cat /tmp/file
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...

~/.ssh/id_rsa.pubまたは、ローカル マシンから~/.ssh/authorized_keysリモート マシンのファイルにファイルを転送する場合など、他の方向に進みたい場合がよくあります。

local> ssh username@remote
remote> ~C
ssh> -R5555:localhost:5555
remote> ~^Z
[suspend ssh]
[1]+  Stopped                 ssh username@remote
local> nc -l 5555 < ~/.ssh/id_rsa.pub &
[2] 26607
local> fg
ssh username@remote
remote> nc localhost 5555 >> ~/.ssh/authorized_keys
remote> cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2ZQQQQBIwAAAQEAsgaVp8mnWVvpGKhfgwHTuOObyfYSe8iFvksH6BGWfMgy8poM2+5sTL6FHI7k0MXmfd7p4rzOL2R4q9yjG+Hl2PShjkjAVb32Ss5ZZ3BxHpk30+0HackAHVqPEJERvZvqC3W2s4aKU7ae4WaG1OqZHI1dGiJPJ1IgFF5bWbQl8CP9kZNAHg0NJZUCnJ73udZRYEWm5MEdTIz0+Q5tClzxvXtV4lZBo36Jo4vijKVEJ06MZu+e2WnCOqsfdayY7laiT0t/UsulLNJ1wT+Euejl+3Vft7N1/nWptJn3c4y83c4oHIrsLDTIiVvPjAj5JTkyH1EA2pIOxsKOjmg2Maz7Pw== username@local

少し説明が整いました。

最初のステップはLocalForward;を開くことです。まだ確立していない場合は、~Cエスケープ文字を使用して ssh コマンド ラインを開き、次のコマンドを実行できます。

remote> ~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

この例LocalForwardでは、クライアントとサーバーの両方に対して localhost のポート 6666 を確立します。ポート番号は、開いている任意のポートにすることができます。

ncコマンドはnetcatパッケージからのものです。「TCP/IP スイス アーミー ナイフ」と呼ばれています。シンプルですが、非常に柔軟で便利なプログラムです。Unix ツールベルトの標準的な部分にしてください。

この時点ncで、ポート 6666 でリッスンし、別のプログラムがそのポートに接続して の内容を送信できるようになるのを待っています /etc/passwd

~^Z次に、 がtilde 続く別のエスケープ文字を使用しcontrol-Zます。これにより、ssh プロセスが一時的に中断され、シェルに戻ります。

nc転送されたポート 6666 に接続するために使用できるローカル システムに 1 つ戻ります-l。この場合、a がないことに注意してくださいnc。代わりに、リモート側でnc既にリッスンしている に接続するためのクライアントとして使用したいだけです。nc

コマンドに関する残りの魔法ncが必要です。上記でsshプロセスが一時的に中断されたことを思い出してください。そのため、式&全体(sleep + nc)がバックグラウンドに置かれ、sleepssh が でフォアグラウンドに戻るのに十分な時間が与えられますfg

-R2 番目の例では、代わりに を使用して反対方向に向かうトンネルを設定することを除いて、考え方は基本的に同じ-LですRemoteForward。そして、ローカル側は-l引数を使用したい場所ですnc

デフォルトのエスケープ文字は ~ ですが、次のように変更できます。

 -e escape_char
         Sets the escape character for sessions with a pty (default: ‘~’).  The escape character is only recognized at the beginning of a line.  The escape character followed by a dot
         (‘.’) closes the connection; followed by control-Z suspends the connection; and followed by itself sends the escape character once.  Setting the character to “none” disables any
         escapes and makes the session fully transparent.

エスケープ文字で使用できるコマンドの完全な説明は、ssh のマンページにあります。

ESCAPE CHARACTERS
     When a pseudo-terminal has been requested, ssh supports a number of functions through the use of an escape character.

     A single tilde character can be sent as ~~ or by following the tilde by a character other than those described below.  The escape character must always follow a newline to be interpreted
     as special.  The escape character can be changed in configuration files using the EscapeChar configuration directive or on the command line by the -e option.

     The supported escapes (assuming the default ‘~’) are:

     ~.      Disconnect.

     ~^Z     Background ssh.

     ~#      List forwarded connections.

     ~&      Background ssh at logout when waiting for forwarded connection / X11 sessions to terminate.

     ~?      Display a list of escape characters.

     ~B      Send a BREAK to the remote system (only useful for SSH protocol version 2 and if the peer supports it).

     ~C      Open command line.  Currently this allows the addition of port forwardings using the -L, -R and -D options (see above).  It also allows the cancellation of existing remote port-
             forwardings using -KR[bind_address:]port.  !command allows the user to execute a local command if the PermitLocalCommand option is enabled in ssh_config(5).  Basic help is avail‐
             able, using the -h option.

     ~R      Request rekeying of the connection (only useful for SSH protocol version 2 and if the peer supports it).
于 2011-12-07T12:07:56.713 に答える
1

ControlMaster (-M スイッチ) を使用することが最善の解決策であり、ここでの残りの回答よりもはるかにシンプルで簡単です。複数のセッション間で単一の接続を共有できます。ポスターが望んでいることをしているように聞こえます。ただし、scp または sftp コマンドラインを入力する必要があります。それを試してみてください。私はすべてのsshingにそれを使用します。

于 2011-05-30T08:10:03.577 に答える
0

これがこの問題に対する私の好ましい解決策です。sshセッションの作成時にリバースsshトンネルを設定します。これは、2つのbash関数によって簡単になります。grabfrom()はローカルホストで定義する必要があり、grab()はリモートホストで定義する必要があります。必要に応じて、使用する他のssh変数(たとえば、-Xまたは-Y)を追加できます。

function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; };
function grab() { scp -P 2202 $@ localuser@127.0.0.1:~; };

使用法:

localhost% grabfrom remoteuser@remotehost
password: <remote password goes here>
remotehost% grab somefile1 somefile2 *.txt
password: <local password goes here>

良い点:

  • OpenSSH以外のいずれのホストでも特別なソフトウェアなしで動作します
  • ローカルホストがNATルーターの背後にある場合に機能します
  • 2つの1行bash関数のペアとして実装できます

ネガ:

  • 固定ポート番号を使用するため、次のようになります。
    • リモートホストへの複数の接続では機能しません
    • リモートホストでそのポートを使用しているプロセスと競合する可能性があります
  • ローカルホストがssh接続を受け入れる必要があります
  • セッションの開始時に特別なコマンドが必要です
  • ローカルホストへの認証を暗黙的に処理しません
  • ローカルホスト上の宛先ディレクトリを指定することはできません
  • 複数のローカルホストから同じリモートホストにグラブする場合、sshはキーの変更を嫌います

今後の作業:これはまだかなり厄介です。明らかに、sshキーを適切に設定することで認証の問題を処理することが可能であり、grab()にパラメーターを追加することでリモートディレクトリの指定を許可することはさらに簡単です。

より難しいのは、他のネガティブに対処することです。動的ポートを選択するのは良いことですが、私が知る限り、そのポートをリモートホストのシェルに渡すエレガントな方法はありません。私が知る限り、OpenSSHではリモートホストに任意の環境変数を設定することはできず、bashはコマンドライン引数から環境変数を取得することはできません。動的ポートを選択できたとしても、最初に接続せずにリモートホストで使用されないようにする方法はありません。

于 2008-09-16T17:34:50.330 に答える
0

これを行うために、ポート 22 を自宅のマシン (職場のマシンからの ssh 接続のみを受け入れるようにファイアウォールで保護されています) に転送するように自宅のルーターを設定し、動的 ​​DNS を提供するためにDynDNSでアカウントを設定しています。自動的にホーム IP に解決されます。

次に、職場のコンピューターに ssh 接続すると、最初に ssh-agent を起動するスクリプトを実行します (サーバーが自動的に起動しない場合)。私が実行するスクリプトは次のとおりです。

#!/bin/bash

ssh-agent sh -c 'ssh-add < /dev/null && bash'

毎回入力する必要がないように、ssh キーのパスフレーズを要求されます。パスフレーズなしで ssh キーを使用する場合、この手順は必要ありません。

セッションの残りの部分では、ファイルをホーム マシンに送り返すのは次のように簡単です。

scp file_to_send.txt your.domain.name:~/
于 2008-09-08T15:28:30.543 に答える
0

これは ssh-xfer と呼ばれるハックで、正確な問題に対処しますが、OpenSSH にパッチを適用する必要があります。

于 2008-09-08T15:29:20.447 に答える
0

これを使用する最良の方法は、HTTP 経由でファイルを公開し、別のサーバーからダウンロードすることZSSHです。Python ライブラリを使用してこれを実現できます。

ZSSH - SSH 経由の ZIP (サーバー間でファイルを交換するための単純な Python スクリプト)。

PIP を使用してインストールします。

python3 -m pip install zssh

リモート サーバーからこのコマンドを実行します。

python3 -m zssh -as --path /desktop/path_to_expose

別のサーバーから実行するための URL が表示されます。

それらのファイルをダウンロードして抽出する必要があるローカルシステムまたは別のサーバー。

python3 -m zssh -ad --path /desktop/path_to_download --zip http://example.com/temp_file.zip

このライブラリの詳細: https://pypi.org/project/zssh/

于 2020-04-25T21:21:08.980 に答える
-1

認証が不要になるように、公開鍵と秘密鍵を設定できる必要があります。

どちらの方法を使用するかは、セキュリティ要件などによって異なります(キーを調べて、攻撃できる他のホストを見つけるlinux / unix sshワームがあることに注意してください)。

私はこれをlinksysとdlinkルーターの両方の背後から常に行っています。いくつかの設定を変更する必要があると思いますが、大したことではありません。

于 2008-09-08T15:14:51.857 に答える
-1

-M スイッチを使用します。

"接続共有のために ssh クライアントを「マスター」モードにします。複数の -M オプションを指定すると、ssh が「マスター」モードになり、スレーブ接続が受け入れられる前に確認が必要になります。詳しくは、ssh_config(5) の ControlMaster の説明を参照してください。詳細。"

それがOPの質問にどのように答えるかはよくわかりません-これについて少し詳しく説明してもらえますか、デビッド?

于 2008-09-08T15:49:36.093 に答える