SSH-別のSFTPセッションを開かずにファイルを転送する方法?
質問
実際にはプログラミングの質問ではありませんが、多くのプログラマーに関連しています...
別のコンピューターへのSSHセッションを開いたとしましょう。
remote:html avalys $ ls
welcome.msg index.html readme.txt
remote:html avalys $
現在のディレクトリ(welcome.msgなど)のファイルの1つをローカルコンピューターに直ちに転送するリモートシェルに入力できるコマンドはありますか?
remote:html avalys $ stransfer welcome.msg
/home/avalys/html/welcome.msgをwelcome.msgに取得
/home/avalys/html/welcome.msg 100%23KB 23.3KB / s 00:00
remote:html avalys $
これを行うために知っている唯一の方法は、SSHセッションで現在のディレクトリに対して並列SFTPセッションとCDを開くことです。これは、サーバーをリモートで管理する場合の本当のPITAです。
編集:リバースsftp / scp接続を使用する可能性を認識していますが、それはより多くの入力を必要とします。いくつかのコマンドの名前(例:" stransfer")と、転送したいファイルを入力して、機能させるだけでいいのです。
解決
ssh -Port:127.0.0.1:22 user @ host with scp backを使用して、このような逆転送接続を設定できます。
scp user @ host:port
を使用してアクセスします。
他のヒント
これを調査して、opensshクライアントzsshのドロップイン置換として機能するプログラムを見つけました。
sudo apt-get install zssh
zssh user@remote
sudo apt-get install zssh
sz file.name
<ctrl>+<space>
rz
チャームのように動作します。
この問題に対する私の好ましい解決策は次のとおりです(重複した質問で尋ねたとおり)。 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接続を許可する必要がある
- セッションの開始時に特別なコマンドが必要です
- ローカルホストへの認証を暗黙的に処理しません
- ローカルホスト上の宛先ディレクトリを指定することはできません
- 複数のlocalhostから同じリモートホストにアクセスする場合、sshはキーの変更を気にしません
今後の作業: これはまだかなり厄介です。明らかに、sshキーを適切に設定することで認証の問題を処理することができ、パラメーターをgrab()
に追加することでリモートディレクトリの指定を許可するのはさらに簡単です他のネガに対処することはさらに困難です。動的ポートを選択するのは良いことですが、私が知る限り、そのポートをリモートホスト上のシェルに渡すエレガントな方法はありません。私の知る限り、OpenSSHではリモートホストに任意の環境変数を設定できず、bashはコマンドライン引数から環境変数を取得できません。動的ポートを選択できたとしても、最初に接続しなければリモートホストで使用されないようにする方法はありません。
sshfsを使用してssh接続をマウントできます。こうすることで、同じssh接続内でファイルを転送しながら、最も好きなsshクライアントを使用できます。必要に応じて、自動マウントするように設定することもできます。
パッチを適用する場合(IMHOにパッチを適用しないでください)、 ssh-xfer
ファイル名の引数を取るstransferという名前のbashスクリプトを作成し、scpコマンドにファイル名を挿入します。サーバーとサーバー上のファイルへのパスは変わらないと仮定します。
またはファイルが常に同じ場合、〜/ .bashrcファイルにエイリアスを作成できます。
alias getwelcome = 'scp avalys @ remotehost:/home/avalys/html/welcome.msg。'
Paul Tomblinが質問へのコメントで書いたのと同じ考えを持っていました。古い端末セッションは、x-、y-、およびz-modemプロトコルおよびツール(z-modemバリアントの sz
および rz
)を使用して、このようなことを実現していました。これらがsshセッションで機能するかどうかはわかりませんが、試してみる価値はあります。
Fink は、Mac OS Xのこれらのツールに lrzsz
パッケージを提供します。
Paulが最初にそこに着いた後に担当者を得るのは気分が悪いので、これをコミュニティwikiにしています...
学校で、あるLinuxシステムから別のLinuxシステムにファイルを転送する場合、通常はsshを使用してリモートに接続し、scpを使用してリモートシステムからコンピューターにファイルを転送します。それがあなたが探しているものなのか、それがあなたの場合にも当てはまるのかどうかはわかりませんが、通常は別の端末ウィンドウを開かなければならない私の方法です。
scpに精通していない場合は、コンピューターにファイルを配置する場所を指定する必要がありますが、とにかくこれは一般的にファイルの場所よりも覚えやすいものですリモートコンピューター上。役立つリンクを次に示します。 http://www.computerhope.com/unix/scp .htm
https://superuser.com/questions/259481/reverse-scp-over-ssh -connection
sftp server
get file.txt
どうやら、sftpコンソールでn個をナビゲートすることもでき、 get
は完全なファイルパスを取ります。 sftp
を実行したディレクトリにコピーします。