SSH - способ передачи файлов без открытия отдельной сессии SFTP?

Не проблема программирования, но актуальная для многих программистов...

Скажем, я открыл сеанс SSH на другом компьютере.

remote: html avalys $ls
welcome.msg index.html readme.txt
remote: html avalys $

Есть ли какая-либо команда, которую я могу ввести в свою удаленную оболочку, которая немедленно перенесет один из файлов в текущем каталоге (например, welcome.msg) на мой локальный компьютер, т.е.

удаленный: 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 $

Единственный способ, которым я знаю, это открыть параллельный сеанс SFTP и CD в мой текущий каталог в сеансе SSH, который является реальной PITA при удаленном администрировании сервера.

EDIT: Я знаю о возможности использования обратного соединения sftp/scp, но это требует большего набора текста. Было бы здорово, если бы я мог набрать только имя какой-либо команды (например, "stransfer" ) и файлы, которые я хочу передать, и иметь его Just Work.

Ответ 1

Вы можете настроить такое перевернутое соединение передачи w/ ssh -Rport:127.0.0.1:22 [email protected] for scp back.

Use scp [email protected]:port для доступа к нему.

Ответ 2

Вот мое предпочтительное решение этой проблемы [как указано в повторяющемся вопросе, который я задал]. Настройте обратный туннель ssh при создании сеанса ssh. Это облегчается с помощью двух функций bash: grabfrom() должен быть определен на локальном хосте, а grab() должен быть определен на удаленном хосте. Вы можете добавить любые другие переменные ssh, которые вы используете (например, -X или -Y), как вам удобно.

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

Использование:

localhost% grabfrom [email protected]
password: <remote password goes here>
remotehost% grab somefile1 somefile2 *.txt
password: <local password goes here>

Положительных:

  • Он работает без специального программного обеспечения на любом узле за пределами OpenSSH
  • Он работает, когда локальный хост находится за NAT-маршрутизатором.
  • Он может быть реализован как пара двух однострочных bash функций

Отрицательных:

  • Он использует фиксированный номер порта, поэтому:
    • не будет работать с несколькими подключениями к удаленному хосту.
    • может конфликтовать с процессом, использующим этот порт на удаленном хосте
  • Требуется, чтобы localhost принимал ssh-соединения
  • Для инициализации сеанса требуется специальная команда
  • Он не подразумевает проверку подлинности на localhost
  • Он не позволяет указать каталог назначения на localhost
  • Если вы захватите несколько локальных хостов на один и тот же удаленный хост, ssh не понравится, чтобы клавиши меняли

Будущая работа: Это все еще довольно клочья. Очевидно, что можно было бы решить проблему аутентификации, настроив соответствующие ключи ssh, и еще проще разрешить спецификацию удаленного каталога, добавив параметр для grab()

Сложнее решать другие негативы. Было бы неплохо выбрать динамический порт, но насколько я могу судить, нет элегантного способа передать этот порт оболочке на удаленном хосте; Насколько я могу судить, OpenSSH не позволяет вам устанавливать произвольные переменные среды на удаленном хосте, а bash не может принимать переменные среды из аргумента командной строки. Даже если вы можете выбрать динамический порт, нет способа убедиться, что он не используется на удаленном хосте без первого подключения.

Ответ 3

В ходе исследования я нашел программу, которая работает как замена для клиента openssh, zssh.

sudo apt-get install zssh
zssh [email protected]
sudo apt-get install zssh
sz file.name
<ctrl>+<space>
rz

Работает как шарм.

Ответ 4

Вы можете подключить ssh-соединение с помощью sshfs. Таким образом, вы можете передавать файлы в одном и том же ssh-соединении, используя любой клиент ssh, который вам больше всего нравится. Вы даже можете настроить его, если хотите.

Ответ 5

Если вы занимаетесь исправлением (что IMHO не следует исправлять), посмотрите ssh-xfer

Ответ 6

Вы можете написать bash script с именем stransfer, который будет принимать аргумент имени файла, затем он будет вставлять имя файла в команду scp, предполагая, что сервер и путь к файлам на сервере не изменяются.

Или, если файл всегда один и тот же, вы можете создать псевдоним в файле ~/.bashrc.

alias getwelcome = 'scp avalys @remotehost:/home/avalys/html/welcome.msg.'

Ответ 7

У меня была такая же мысль, что Павел Томблин написал в комментарии к этому вопросу. В старых сеансах терминала использовались протоколы и инструменты x-, y- и z-модема (sz и rz для вариантов z-модема), чтобы добиться чего-то подобного. Я не уверен, что они будут работать через сеанс ssh, но, возможно, стоит попробовать.

Fink поставляет пакет lrzsz с этим инструментом в Mac OS X.

Создание этой вики сообщества, потому что я плохо себя чувствую для получения репутации после того, как Пол попал туда первым...

Ответ 8

В школе, если я переношу файл из одной Linux-системы в другую, я обычно удаляю с помощью ssh, а затем использую scp для переноса файла из удаленной системы обратно на свой компьютер. Не уверен, что это то, что вы ищете, или если это даже применимо в вашем случае, но обычно это мой способ обойтись, чтобы открыть другое окно терминала.

Чтобы уточнить, не знакомы ли вы с scp, вам все равно нужно указать местоположение, которое вы хотели бы разместить на своем компьютере, но для меня это вообще легче запомнить, чем расположение файла на удаленном компьютере. Вот ссылка, которая может быть полезна: http://www.computerhope.com/unix/scp.htm

Ответ 9

https://superuser.com/info/259481/reverse-scp-over-ssh-connection

sftp server
get file.txt

По-видимому, вы также можете перемещаться вокруг n вещей в консоли sftp, а get - полный путь к файлу. Копирует в каталог, из которого вы запустили sftp.