Скопируйте файл обратно в локальную систему с помощью ssh

258

Если я вошел в систему через SSH, есть ли способ скопировать файл обратно в мою локальную систему без запуска другого терминала или сеанса экрана и выполнения scp или чего-то подобного или без выполнения SSH из удаленной системы обратно в локальная система?

Шон Дж. Гофф
источник
4
Если у вас есть ssh-сервер на вашем клиенте, вы всегда можете попробовать scp file.foo user@myclient.com:file.foo: P
rahmu
4
Конечно, но я не хочу разрешать доступ к своему компьютеру с сервера, принадлежащего компании, на которую я работаю :). В любом случае, у меня здесь есть только аутентификация на основе ключей, и было бы не слишком безопасно размещать свой закрытый ключ. на сервере!
Нафтули Кей
2
Я не понимаю твою проблему. Сгенерируйте новую пару ключей, скопируйте открытую часть на ваши компьютеры authorized_keys и после передачи удалите эту строку снова.
Нильс
8
Я часто это делаю, поэтому было бы неэффективно делать это каждый раз, когда я хочу скопировать файл в середине сеанса SSH. Я просто ищу способ во время сеанса терминала SSH подключиться к моему локальному компьютеру и отправить его на удаленный сервер, не выходя из текущего сеанса SSH.
Нафтули Кей
2
Проблема заключается в том, что первоначальный вход в систему через ssh может быть проблематичным (2fa или другие проблемы, помимо ключа или пароля), у нас может не быть привилегий, чтобы изменить конфигурацию сервера ssh, нет причин для многократного согласования ключей, и что, как только у нас будет сеанс, было бы хорошо использовать этот сеанс для нескольких вещей.
Дуанев

Ответы:

139

Мастер связи

Это проще всего, если вы планируете заранее.

Откройте мастер-соединение в первый раз. Для последующих подключений маршрутизируйте подчиненные соединения через существующее главное соединение. В ваших ~/.ssh/config, настроить общий доступ к подключению происходит автоматически:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Если вы запустите сеанс ssh с тем же пользователем (пользователь, порт, компьютер), что и с существующим соединением, второй сеанс будет туннелироваться поверх первого. Установка второго соединения не требует новой аутентификации и выполняется очень быстро.

Таким образом, пока у вас есть активное соединение, вы можете быстро:

экспедиция

На существующем соединении вы можете установить обратный туннель SSH. В командной строке ssh создайте удаленную переадресацию, передав, -R 22042:localhost:22где 22042 - это случайно выбранный номер, который отличается от любого другого номера порта на удаленном компьютере. Затем ssh -p 22042 localhostна удаленной машине соединяет вас обратно с исходной машиной; Вы можете использовать scp -P 22042 foo localhost:для копирования файлов.

Вы можете автоматизировать это дальше с RemoteForward 22042 localhost:22. Проблема в том, что если вы подключаетесь к одному и тому же компьютеру с несколькими экземплярами ssh или если кто-то другой использует порт, вы не получите переадресацию.

Если вы не включили удаленную пересылку с самого начала, вы можете сделать это в существующем сеансе ssh. Тип Enter ~C Enter -R 22042:localhost:22 Enter. См. «Escape-символы» в руководстве для получения дополнительной информации.

Есть также некоторая интересная информация в этой теме неисправности сервера .

Копировать вставить

Если файл небольшой, вы можете напечатать его и скопировать и вставить из вывода терминала. Если файл содержит непечатаемые символы, используйте кодировку, например base64 .

remote.example.net $ base64 <myfile
 (скопируйте вывод)
local.example.net $ base64 -d> myfile
 (вставить содержимое буфера обмена)
Ctrl +D

Удобнее, если у вас активна переадресация X, скопируйте файл на удаленный компьютер и вставьте его локально. Вы можете передавать данные в и из xclipили xsel. Если вы хотите сохранить имя файла и метаданные, скопируйте и вставьте архив.

remote.example.net$ tar -czf - myfile | xsel

local.example.net$ xsel | tar -xzf -
жилль
источник
Если мы можем передавать файлы с использованием SSH, почему люди все еще нуждаются / используют SFTP?
Pacerier
3
@Pacerier Потому что SFTP - это способ передачи файлов с использованием SSH.
Жиль
Зачем людям вообще нужен SFTP, если они могут передавать файлы по SSH-без-SFTP?
Pacerier
Метод копирования-вставки особенно удобен для цепных соединений (т.
Е. Для перехода
1
@Pacerier SFTP имеет несколько дополнительных команд, таких как списки файлов или удаление удаленного файла и т. Д.
rahmu
68

Другим (ИМО) простым способом будет:

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

Или, если вы предпочитаете что-то похожее на GUI, попробуйте Midnight Commander . Они называют функцию Shell-Link . Большинство дистрибутивов имеют их в своих системах пакетов как mc.

Флориан Фида
источник
8
Честно говоря, я не понимаю, почему за это не проголосовали. ОП попросил решение без scp. Иногда, особенно в моем случае, когда я ssh'ing в очень урезанный маршрутизатор, предоставленный провайдером, у меня нет sftp, у меня нет scp, и даже ftp сильно сломан. Я знал, что могу сделать это, я просто пришел сюда, чтобы убедиться, что мой синтаксис был правильным.
Auspex
1
Brilliant! mcсамый быстрый в использовании.
Намек
2
На самом деле, это решение не работает в моем случае. С туннелем, созданным из Windows в Linux, вы начинаете с putty, а не с терминала. Этот метод именно то, что я хотел, но я не могу его использовать. Раздраженный.
Бенджамин
1
Причина, по которой я не одобряю это, заключается в том, что он не будет работать, если клиентский компьютер находится за общим маршрутизатором (например, в корпоративной сети). Предположим, что я на рабочем компьютере и ssh'd на моем домашнем сервере. Как мне скопировать файл на мой рабочий компьютер, пройдя через сложную работу со сложными каталогами с пробелами и специальными символами?
Шридхар Сарнобат
1
Он отлично работает с двоичными данными. Я делаю это с tgzфайлами все время :)
Флориан Фида
53

SSH поддерживает несколько команд через escape-символ ( ~по умолчанию):

$ ~?
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> 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
      !args                                  Execute local command

!args, Кажется, ближе всего к тому , что вы хотите. Обратите внимание, что вам нужно PermitLocalCommandвключить в вашем /etc/ssh_configфайле, чтобы ~Cкоманды работали (см. man ssh_config).

Вы можете повторно использовать тот же сеанс SSH , если вы создали ControlMasterв системе ssh_config. Если вы делаете это:

$ ~C
ssh> !scp file user@myserver:

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

Кори Хендерсон
источник
Это все еще работает? Я не мог найти !argsв сообщении помощи.
xuhdev
@xuhdev он все еще там на OpenSSH_7.2p2, argsне в первом справочном сообщении ( ~?), а во втором (когда вы вводите ssh>подсказку с помощью ~C, вы можете набирать helpв ssh>подсказке)
sdaau
Это выглядит как хорошее решение (хотя я не пробовал), я не знал, что вы можете получить родительский буфер командной строки, vim-style. На практике, кто-то может просто предпочесть открыть новую вкладку терминала, чтобы они не забыли, как вернуться в сессию (например, когда я не могу вспомнить, как выйти из Emacs).
Шридхар Sarnobat
37

Это все очень сложные методы.
Вы можете смонтировать удаленную файловую систему на локальном компьютере с помощью sshfs:

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

Затем вы можете скопировать и вставить файл с помощью nautilus, gnome, konqueror, dolphin, bash или чего-либо еще.

затруднительное положение
источник
4
Подключение к ключевому файлу:sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow
15
  • Используйте ssh-xfer , модифицированный ssh-agent, который эффективно перегружает существующий боковой канал ssh для передачи файлов.
  • Используйте zssh , который эффективно zmodem поверх ssh. Если вы когда-либо использовали rzsz, это покажется вам очень знакомым.
  • Обратный ( -Rдля удаленного в локальный) или прямой ( -Lдля локального в удаленный) порты для запуска передачи файлов, если у вас есть какой-нибудь демон передачи файлов, слушающий на другом конце.

Но ничего из этого действительно не нужно, ИМО. Протокол SSH поддерживает несколько каналов в одном соединении, а клиент OpenSSH поддерживает мультиплексирование. Предполагая, что у вас есть ControlMasterи ControlPath настроить ( ControlPersistэто тоже полезно),

  # первое соединение
$ ssh remote

  # будет мультиплексировать через то же соединение, что и исходный ssh
$ sftp remote
ephemient
источник
5
zmodem напоминает мне о загрузке последней версии условно бесплатного программного обеспечения с местной BBS .. :-)
Стюарт Вудворд,
Способ xfer - это именно то, что я искал, но знаете ли вы, почему исправление ssh-xfer не включено в апстрим OpenSSH? Немного пламени?
Ферран Басора
Спасибо за зссь намек! Я использую tmux в Konsole и из-за tmux мой "sz" с сервера больше не работает. ЗСШ решает мои проблемы!
0xAF
9

Еще более простой подход: откройте Filezilla (или ваш любимый ftp-браузер), откройте ssh-соединение с тем же сайтом, найдите файл и перетащите его в локальную файловую структуру. Если вы новичок в Filezilla, воспользуйтесь функцией «менеджер сайтов», чтобы быстро подключиться в следующий раз.

Да, я знаю, что это очевидно для большинства из вас (и не совсем точно), но некоторые (как я), которые нашли этот поток, ищущий решение только для терминала, возможно, упустили очевидное.

Ларри Джонс
источник
Я считаю, что сервер FileZilla только для Windows. Клиент кроссплатформенный, хотя
Freedom_Ben
Вы можете даже использовать Каху, просто откройте ssh://SERVER.
basic6
8

То, что я считаю лучшим и наиболее эффективным решением - это использовать xclip-copyfileи xclip-pastefile.

На сервере вы используете xclip-copyfileдля копирования один или несколько файлов. Эти файлы затем доступны на вашем локальном сервере. Там вы можете использовать xclip-pastefile.

Это обходит необходимость использовать scpили иметь локальный ssh-сервер. Я использую это с Cygwin, например. Единственная проблема заключается в том, что это требует установки, xclipесли у вас его еще нет. О, и это работает с двоичными файлами тоже.

Роберт
источник
Ого, это может быть лучшим решением, чем переадресация моего порта с обратным портом плюс netcat.
Шридхар Сарнобат
3

Одна из многих причин, по которым мы используем SecureCRT - несмотря на то, что предпочитаем программное обеспечение с открытым исходным кодом, где это практически возможно, - это простота передачи файлов. В мире F / OSS просто нет прямой замены.

SecureCRT начиналась как чистая программа для Windows в середине 1990-х, но была перенесена на Mac OS X и Linux пару лет назад .

SecureCRT имеет три основных функции для передачи файлов в систему и из системы, в которую вы используете SSH:

  • ZModem , YModem , XModem , Kermit и ASCII - SecureCRT - это эмулятор терминала старого типа, поддерживающий несколько внутриполосных протоколов передачи файлов.

    Самым простым в использовании является ZModem. Когда вы набираете что-то вроде sz file-to-downloadудаленной командной строки, удаленная szпрограмма записывает escape-последовательность, которая сообщает SecureCRT немедленно начать загрузку file-to-downloadв каталог загрузки по умолчанию.

    Приятно отметить, что каталог загрузки настраивается для каждой сессии. Мы используем это, чтобы иметь каталоги для сайтов на нашем файловом сервере в главном офисе, поэтому нам не нужно вручную сортировать загруженные файлы.

    ( szэто программа «send ZModem», входящая в состав lrzszпакета. Она уже упакована для большинства систем Unixy. Если по какой-то причине в вашей удаленной системе она еще не установлена, и вы не можете легко установить двоичный пакет, Исходный пакет небольшой и легко переносимый. Мне не раз приходилось посылать lrzsz «архив» или uuencode«tarball» в урезанную удаленную систему, чтобы я мог в нее загружать файлы ZModem.)

  • SFTP - SecureCRT имеет тесно интегрированную базовую реализацию SFTP.

    Под «плотной интеграцией» я подразумеваю, что когда вы даете команду меню SFTP или сочетание клавиш, она открывает новую вкладку, подключенную к удаленному сайту через то же соединение SSH. Таким образом, вам не нужно снова входить в систему, и соединение устанавливается немного быстрее, чем если бы вы открыли отдельное SFTP-соединение с тем же сервером.

    Я характеризую функцию SFTP как «базовую», потому что у VanDyke Software есть отдельный продукт для передачи файлов, SecureFX . Это более функционально, чем встроенный SFTP-клиент, а также интегрируется с SecureCRT.

    Функция SFTP SecureCRT позволяет вам настроить удаленные и локальные каталоги по умолчанию, которые отделены от конфигурации ZModem.

    Эта функция SFTP имеет базовый интерфейс командной строки, имитирующий sftpпрограмму OpenSSH , за исключением того, что она имеет такие возможности, как Tabзавершение команды. Таким образом, поиск удаленного файла называется somefile.tar.gzтак же просто, как get soTabEnter.

  • Перетаскивание - если вы перетаскиваете файл в окно терминала, он автоматически печатает rzдля вас и начинает отправку файла.

    Кроме того, вы можете открыть вкладку SFTP и перетащить файл на эту вкладку, чтобы отправить его через SFTP. Таким образом, отправка файла на удаленную систему может быть столь же просто , как Alt-P, перетащить , каплю .

    Мы находим, что передача происходит намного быстрее через SFTP, возможно, потому что это протокол на основе TCP, поэтому он выигрывает от больших скользящих окон современных стеков TCP / IP . ZModem был разработан в те дни, когда размер блока в 64 КБ считался «большим». Таким образом, большая часть потенциальной скорости в канале поглощается в ZModem, в то время как каждый конец ожидает подтверждения передачи блока.

    Приятной особенностью режима перетаскивания является то, что он снимает одно из стрессов при использовании ZModem. Когда вы rzпечатаете на удаленной системе, SecureCRT автоматически открывает окно выбора файлов. Затем у вас есть около минуты, чтобы найти и выбрать файл до истечения времени ожидания удаленной стороны. Это создает атмосферу гонки на часах, которая не нравится. Перетаскивание позволяет найти файл на досуге, а затем начать передачу одним быстрым движением мыши.

    Мы все еще используем ручной метод, начиная передачу с явной rzкоманды. Это связано с тем, что SecureCRT позволяет настраивать каталог загрузки для каждой сессии, который мы указываем на папку на файловом сервере, которая всегда содержит последнюю версию программного обеспечения, которое работает на конкретном удаленном сайте. Для таких передач нет гонки на время, так как сборщик файлов открывается в правильном месте для начала.

Уоррен Янг
источник
1

Используйте "!" преобразовать файл в ASCII-представление вашего файла (например ! uuencode myfile.bin >uuencode.dat). Тогда используйте ! cat uuencode.dat >target.dat. После этого используйте uudecode на целевой стороне:! uudecode target.dat >myfile.bin

Nils
источник