scpまたはsftpを使用せずにSSH経由でファイルを転送する

scpまたはsftpを使用せずにSSH経由でファイルを転送する

以下を介してファイルを転送する必要がありますsshが、残念ながら、私が接続しているホストは、コンピュータに接続されたプライベートスーパーコンピューティングネットワークでのみ利用可能な別のノードにリダイレクトする「ゲート」ノードにすぎないため、scpこれは不可能です。sftpパスワードを2回入力する必要があります。)したがって、ゲートノードではどのコマンドも実行できません。

SSH接続の出力(ターミナル)ストリームを使用してファイルを転送するためのいくつかのツールが利用可能かどうか疑問に思います。

唯一のオプションは、ファイルを便利な形式(例:base64)で出力し、クリップボードにコピーしてローカルにデコードすることです(またはその逆)。

vimを遠隔で使うことにイライラを感じ始めました。私が実装したいのは、プログラムのソースコードをローカルで編集してからリモートでテストするrsyncのようなシステムですが、見てわかるようにそれほど簡単ではありません。

おそらく私だけがこの問題を経験しているのではないでしょう。したがって、この目的のためのツールが必要ですか? (FUSEを使用するソリューションが最善ですが、これがあまりにも多くを必要とする可能性があることを知っています。)

答え1

回答をしたくありませんが、コメントウィンドウがますます大きくなり、SEからチャットウィンドウをチャットウィンドウに移動するように通知されます。

したがって、enter数回クリックして~?スペースを入力しないでください。何もない。

次の(またはまさにこのような)コンテンツが表示されます。

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>この時点で入場してください

ssh> !scp /path/to/some/file/on/your/local/machine user@remoteserver

すでに認証されているため、既存の接続を介してファイルを転送する必要があります。

答え2

タスクをどのように自動化したいかによって、expect人間のようにSSHセッションにデータを「供給」することで、Bascheonホストを介して内部システムにデータを渡すことを選択できますが、はるかに高速です。

#!/usr/bin/env expect

if {[llength $argv] == 0} {
  puts stderr "Usage: $argv0 bastion internalhost localfile"
  exit 1
}

set basthost [lindex $argv 0]
set desthost [lindex $argv 1]
set fileup   [lindex $argv 2]

spawn ssh -a -e none -o ClearAllForwardings=yes -x $basthost

# TODO login foo here for bastion host, e.g. send the password
# if see that prompt

expect {
  # TODO handle timeout, eof, etc.

  # TODO I have no idea what your ncurses interface looks
  # like, though there's doubtless something that could
  # be matched and the appropriate input sent to it...
  -ex "$ " {
    send -- "ssh $desthost\r"
    # TODO handle subsequent login to the internal host here
  }
}

その後、(適切なステートメントを介して)ターゲットホストにエディタまたは他のエントリが開いている場合は、次のようにsendデータを提供できます。

set upfd [open $fileup]
while {[gets $upfd line] >= 0} {
  send -- "$line\r"
}

次に、より多くのsend呼び出しを使用してファイルの保存、終了などを実行します。エラー処理などもあります。

答え3

1つ目は、「ドア」またはボックスジャンプを通過するようにコンソールを設定する構成です。あなたは~/.ssh/config次のようになります:

Host door
  Hostname door.example.com
  User username_on_door
  # ...
Host target
  Hostname tagret.example.com
  User user_on_target
  # ...
  ProxyCommand ssh -W %h:%p door

その後、次のいずれかのコマンドを使用してターゲットシステムに直接接続できます。ssh target

その後、単一のコマンドを使用してファイルを前後に転送することもできます。

ssh taget "tar czpf - /some/important/data" | tar xzpf - -C /new/root/directory
tar cpf - /some/important/data | ssh target "tar xpf - -C /some/directory/" 

sshfsホストを起動できます。

sshfs target:/dir/ /mnt/target

複雑すぎませんか?

答え4

SCP2はローカルコンピュータからリモートコンピュータに移動する方法のようです。しかし、私は簡単に別の道に行くことができました。

  • プルしたいフォルダをリモコンに保管しておきました。
    tar cvf folder folder.tar
    
    そしてそうだった
    base64 folder.tar
    
  • テキスト出力をコピーしてローカルコンピュータのファイルに貼り付けますfolder.tar.txt
  • デコード用
    base64 -d folder.tar.txt > folder.tar
    
    次に、次のコマンドを使用してtarを抽出します。
    tar xvf folder.tar
    

関連情報