アクティブなSSHセッションを介してファイルをダウンロードする


86

アクティブなSSHセッションからファイルをダウンロードしたい。多くの場合、私はおそらく可能性だけで、SFTPを使用しscprsyncらが、私は、私はこれらのメソッドを使用することはできません方法で、リモートサーバ上のアクセス権が上昇している時間があります。

あなたは私が何を意味するかを理解するのに苦労している場合は、あなたから何かをダウンロードしたいと想像し/root/たり/var/log/auth.log。ルートログインは無効になっています(私たちはバカではないからです)。そのファイルをどのように取得しますか?保護されていない場所にコピーしてから移動しますか?これは不格好です。また、リモートコマンドの出力をローカルに保存するために、リモートパスが複雑または一時的である、またはパスではないシナリオもあります。リモートで保存してからコピーしますか?クランク!

これらのバージョンを達成するためのいくつかのより不格好な方法がありますが、理想的な世界では、既存のSSHセッションをコンジットとして使用して、リモートサーバーからのローカル書き込みアクセスに似たものがあります。次のようなもの(これは単なるアーティストの印象です):

$oli@remote: cp /root/cheesecake /local/

そして、それはちょうど私のローカルに表示されcwdます。双方向アクセスは悪いことではありません。


この質問をしてから8年が経ち、実際にさまざまな不格好なものを見てきましたが、それでも問題が残ることがあります。

質問をより理想的なものにリファクタリングしました。現在、完璧な答えが得られない可能性があることを完全に理解しています。私の理想に向けた過去および将来の努力はすべて評価されます。


1
興味深い質問です!それは実際に、人々が使用するツールによって、何が賢明であるかについてのアイデアがどのように形作られるかを示しています。 zsshおそらく覚えているかもしれないzmodemのようなワークフローに最も近いでしょう。
プーリー

1
8つの回答を行った後でも、これを行う方法が実際にないことに本当に驚いています。
エンドリス

回答:


34

ユニバースで利用可能なzsshをチェックアウトすることをお勧めします。したがって、

sudo apt-get install zssh

あなたはubuntuサーバーとクライアントでそれを必要としますが、基本的にzsshでログインするとき、 'ctrl- @'を押すだけで、ファイルをあなたのパイプに送り返すことができる「ファイル転送モード」が表示されます。クライアントマシン、またはクライアントからサーバーにアップロードします。

ただし、scpを再認証したり、新しいウィンドウを開いたりする必要はありません。

sshキーとsshエージェントを使用している場合、非常に簡単に実行できます。

[enter]~[ctrl]-Z

sshをバックグラウンドにし、 scp $!:/whatever/whatever .'

ファイルを転送fgしたら、sshを取得します。

sshキーを使用していない場合でも、最近のOpenSShバージョンに追加された「ControlMaster」および「ControlPath」オプションを使用できますが、トリッキーになります。manssh_configを確認してください


24

デスクトップでsshサーバーを実行していると仮定すると(これを回避する方法はありますが、すべて複雑になり、おそらくセキュリティ上の問題があると思います)、リバースsshトンネルをセットアップできます。参照してください。SSHは簡単にローカルシステムにファイルをコピーします。unix.SE終わります。

  • 入力Enter ~C Enter -R 22042:localhost:22 Enterして、サーバーからデスクトップへのリバースポート転送を作成します(22042は、使用されていない1024〜65534の任意のポート番号にすることができます)。
  • 次に、サーバー上の現在のディレクトリにscp -P 22042 foo localhost:あるファイルfooをデスクトップ上の自宅にコピーします。
  • 次に、Enter ~ Ctrl+ を入力して、ファイルをデスクトップ上の現在のディレクトリに移動しますZ mv ~/foo . Enter fg Enter

SSHエスケープシーケンス~;で始まります。チルダは、改行の後にのみ認識されます。~ Ctrl+Zsshをバックグラウンドに入れます。~C転送を作成または削除できるコマンドラインを入力します。


1
2層の暗号化と圧縮を使用するのは少しやり過ぎです。そのため、「バックリンク」にrshまたはftpを使用することをお勧めします。
JanC

2
@JanC:それにはより多くのセットアップが必要です:rshまたはftpサーバーをインストールし、その構成が安全であることを確認する必要があります。暗号化のオーバーヘッドは、ネットブック上でも最小限です。
ジル

ssh-serverもデフォルトではインストールされません。;)
JanC

@JanC:sshのもう1つの利点は、エージェント転送を有効にしている場合、コピーを行うためにパスワードを入力する必要がないことです。計算効率よりもワークフロー効率。
ジル

もちろん、他のサービス(一部)でも同様のことができます。いずれにせよ、トンネル接続と追加のデーモンのセットアップを含む複数の同様のソリューションがあります...;)
JanC

10

標準のsshでこれを行う方法を思いつきました。これは、現在のssh接続を複製し、リモートマシンで作業ディレクトリを見つけ、指定したファイルをローカルマシンにコピーするスクリプトです。ssh configに2つの非常に小さなスクリプト(1つのリモート、1つのローカル)と2行が必要です。手順は次のとおりです。

  1. 以下にこれらの2行を追加します~/.ssh/config

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    machineXへのssh接続を開いている場合、別のパスワードを開くためにパスワードは必要ありません。

  2. というリモートマシンで1行のスクリプトを作成します ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. ローカルマシンで〜/ .grab.shというスクリプトを作成します

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. ~/.bashrcまたはどこでも)grab.shのエイリアスを作成します。

    alias grab=~/.grab.sh
    

これで完了です。にログインしている場合はmachineX:/some/directory、新しいターミナルを起動して次を入力します。

grab machineX filename

これにより、ローカルマシンの現在の作業ディレクトリにファイルが配置されます。「grab」の3番目の引数として別の場所を指定できます。

注:明らかに、両方のスクリプトは「実行可能」でなければなりませんchmod u+x filename


興味深いことに、これがどのように機能するか説明できますか?これを拡張して、ファイルの取得と取得をサポートできますか?
ピーターギブソン14年

5

クライアントマシン(座っているマシン)がmachineAと呼ばれ、現在SSHで接続されているマシンがmachine Bと呼ばれる場合、MachineAは、ローカルマシンでSSHDを実行し、ポート22が開いている必要があります。次に:

scp myfile machineA:

myfileMachineBのmachineAのMachineAホームディレクトリにコピーします。これは、ユーザーID /パスワードが同じであることを前提としています。

scp myfile machineA:/newdir/newname

myfilemachineBを/newdir/newnamemachineAにコピーします。これは、ユーザーID /パスワードが同じであることを前提としています。

scp MachineA:/path/to/my/otherfile . 

otherfileMachineAのMachineAディレクトリからコピーを取得し、MachineBマシンの現在の作業ディレクトリにコピーします(標準のUNIX方式では「ドット」(。)文字で指定)。これは、ユーザーID /パスワードが同じであることを前提としています。

ユーザーID /パスワードが同じでない場合は、次を使用します。

scp myfile user@MachineA: ファイルを取得します。

scp user@MachineA:/path/to/my/otherfile . ファイルを置く

SCPに関する注意:

cpコマンドと同じようscpに、元のファイルのアクセス許可設定をコピーに伝達する-pオプションがあります(そうでない場合は、新しいファイルの通常の設定でコピーが作成されます)。コマンド。

scp2台のマシン間に完全に透過的な暗号化されたデータチャネルが作成されるため、バイナリデータ(イメージや実行可能プログラムなど)は正しく保持されます。これscpは、「ascii」モードのftpで実行できるように、異なるタイプのオペレーティングシステム間で自動行末変換を実行できないことも意味します。Unixシステム間でコピーする場合、これは問題になりません。Unixシステムはすべて同じ行末規則を使用します。


2

ssh経由でサーバーにアクセスすると、sftp経由でも接続できるようになります。filezillaクライアント(GUI)を手元に置いて、現在のパスを貼り付けます

ここに画像の説明を入力してください


2
これには、FileZillaを使用してSSHサーバーに接続する方法など、より詳細な情報が役立ちます(明らかではありません)。説明テキストに加えて、スクリーンショットも役立ちます
エリアケイガン

2

ファイルが十分に小さい場合は、base64でエンコードしてからローカルでデコードできます。

remote.example.net $ base64 <myfile
 (出力をコピー)
local.example.net $ base64 -d> myfile
 (出力をコピー)
Ctrl +D

私がこれを取得した(そしてテストした)元の答え:https : //unix.stackexchange.com/a/2869/194134


それは何と関係がありますか?scpなどでファイルをtxfrにエンコードする必要はありません。
HörmannHH18年

1

アクティブなSSH接続ではありませんが、scpと同じメカニズムとパーミッションを使用してscpがファイルをコピーします。


4
scpは知っていますが、非常にバラバラなワークフローです。特定のリモートディレクトリで作業している場合、リモートパスを取得し、切断(または別のシェルを生成)し、scpingを実行してパスを書き出し、再接続する必要があります。私は書くget fileことに似た何かを探していますが、それは私のマシンに魔法のように表示されます。SSHでトンネリングされたサービスを介してそれを行う必要がある場合は、そうする必要があります。しかし、セッションにバインドする必要があります。
オリ

さらに、sftpに取って代わられました(私の回答を参照)
オリビエラロンド

@Oli-トランザクションの両端は* nixボックスであるため、両方ともsshd実行されている可能性が高いためscp、サーバーのコマンドラインで使用して、ファイルをクライアントに戻すことができます。行き渡る魔法はそれほど多くありません。時々ボタンを押す必要があります。FileZillaソリューションも便利です。
ゼロ帯域幅

1

これはデフォルトのsshセッションでは不可能ですが、ローカルシステムで単純なftpまたはrshサーバーのようなものを起動し、デスクトップに戻るトンネルを設定するために必要なオプションでsshを実行するsshの代わりにスクリプトを使用できますこのサーバーに接続するため。


または可能性だけでscpコマンド/ rsyncの...
HörmannHH

1

konsole リモートセッション(またはCtrl-Alt-U)を使用しているときに、[編集]-> [ZModemアップロード]メニューを使用してその機能を使用できます。

注:lrzsz最初にパッケージをインストールする必要があります。私にとっては、ASCIIファイルのアップロードのみで動作するように見えます。


0

デスクトップから接続しているので、2番目のターミナルを開くことができると思います。

これは私が頻繁に行う方法です:

  • sshセッションが実行されている最初の端末から、realpath myfileまたはreadlink -f myfile(古いUbuntuリリースではプレインストールされませんrealpath)を使用して、取得する必要があるファイルのフルパスを取得してコピーします。
  • scpまたはsftp、ファイルを取得するために使用する2番目の端末から、以前に取得したフルパスを貼り付けます。例えば:scp user@host:/etc/some/file ./

それは非常に基本的ですが、覚えやすく、動作するために余分なパッケージを必要としません。

最初の端末から完全なパスを取得し、2番目の端末に貼り付けます


質問で提起された「ルートファイルを取得してルートで直接ログインすることは許可されていません」という問題は解決しません。
オリ

0

驚くべきことに、古き良き真夜中の司令官についての言及はここにはありません。私の考えでは、これは恐らく電源機能を備えたシェルの最も普遍的で便利なファイルマネージャーであり、このケースに必要なツールの1つであり、SSH、FTP、SFTPを介して接続することもできます2番目のパネルでは、他の(ローカル)ファイルシステムを開くことができるため、ファイルを自由に操作できます。

必要なのは:apt-get install mc(universeから)

その後、mcを実行し、左パネルまたは右パネルのメニューを開き、シェル接続を選択し、username @ remote-ip、パスワードを入力します-実際、それだけです。コピー/コピー(ここではダウンロード)マシン間でファイル/フォルダーをコピーします下のボタンに従って、F5、F6で移動します。古いMSユーザーの場合:DOSのNCのように


-2

どうもこれを考え直します、皆さん。私はすべての深く、暗く、複雑な答えも探していました。結局のところ、缶から出してすぐにドルフィンからこれを行うことができます。fish:// username @ server:port



あなたは私のユースケースを理解していないと思います。アクティブなSSHコマンドラインセッションで、[潜在的に特権がある、つまりSFTP経由では利用できない]ロケーションからローカルコンピューターにファイルを送り返したい。生成時のファイルではなく、コマンド出力である場合もあります。中間ファイルを作成せずに、新しいSFTP / SCP / etcセッションを開始せずにパイプで戻す方法を探しています。
オリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.