SSH - способ передачи файлов без открытия отдельного SFTP-сеанса?
Вопрос
На самом деле это не вопрос программирования, но он актуален для многих программистов...
Допустим, я открыл SSH-сеанс на другом компьютере.
удаленный доступ:html avalys$ ls
добро пожаловать.msg index.html readme.txt
удаленный доступ:html avalys$
Есть ли какая-либо команда, которую я могу ввести в своей удаленной оболочке, которая немедленно передаст один из файлов в текущем каталоге (напримерwelcome.msg) на мой локальный компьютер, т.е.
удаленный доступ:html avalys$ stransfer welcome.msg
Выборка /home/avalys/html/welcome.msg для welcome.msg
/главная страница/avalys/html/welcome.сообщение 100% 23 КБ 23.3КБ/с 00:00
удаленный доступ:html avalys$
Единственный известный мне способ сделать это - открыть параллельный сеанс SFTP и перейти к моему текущему каталогу в сеансе SSH, что является настоящим PITA при удаленном администрировании сервера.
Редактировать:Я знаю о возможности использования обратного соединения sftp / scp, но это требует большего набора текста.Было бы здорово, если бы я мог ввести просто название какой-нибудь команды (например"stransfer"), и файл (ы) Я хочу перенести, и чтобы он просто работал.
Решение
Вы можете установить такое перевернутое соединение для передачи с помощью / ssh -Порт: 127.0.0.1: 22 user @ host для 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-сеанса.Это упрощается с помощью двух функций 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
- Это может быть реализовано в виде пары из двух однострочных функций bash
Негативы:
- Он использует фиксированный номер порта, так что:
- не будет работать с несколькими подключениями к удаленному хосту
- может возникнуть конфликт с процессом, использующим этот порт на удаленном хосте
- Для этого требуется, чтобы localhost принимал ssh-соединения
- Для начала сеанса требуется специальная команда
- Он неявно обрабатывает аутентификацию на локальном хостинге
- Это не позволяет указать каталог назначения на localhost
- Если вы подключаетесь с нескольких локальных хостов к одному и тому же удаленному хосту, ssh не понравится смена ключей
Будущая работа:Это все еще довольно запутанно.Очевидно, что проблему с аутентификацией можно было бы решить, соответствующим образом настроив ssh-ключи, и еще проще разрешить спецификацию удаленного каталога, добавив параметр в grab()
Более сложным является устранение других негативных факторов.Было бы неплохо выбрать динамический порт, но, насколько я могу судить, нет элегантного способа передать этот порт командной строке на удаленном хосте;Насколько я могу судить, OpenSSH не позволяет вам устанавливать произвольные переменные окружения на удаленном хосте, а bash не может принимать переменные окружения из аргумента командной строки.Даже если бы вы могли выбрать динамический порт, нет никакого способа гарантировать, что он не используется на удаленном хосте без предварительного подключения.
Вы можете подключить ssh-соединение с помощью sshfs. Таким образом, вы можете передавать файлы в пределах одного и того же ssh-соединения, используя любой ssh-клиент, который вам больше нравится. Вы даже можете настроить его на автомонтирование, если хотите.
Если вы увлекаетесь исправлениями (которые, по-моему, не следует исправлять), взгляните на
Вы можете написать сценарий bash с именем stransfer, который будет принимать аргумент имени файла, затем он вставит имя файла в команду scp, предполагая, что сервер и путь к файлам на сервере не меняются. Р>
Или, если файл всегда один и тот же, вы можете создать псевдоним в файле ~ / .bashrc. alias getwelcome = 'scp avalys @ remotehost: /home/avalys/html/welcome.msg.'
У меня была такая же мысль, что Пол Томблин написал в комментарии к вопросу. Старые терминальные сеансы использовались для использования протоколов и инструментов x-, y- и z-модема ( sz
и rz
для вариантов z-модема) для достижения чего-то подобного. Я не уверен, будут ли они работать в течение сеанса SSH, но, возможно, стоит попробовать.
Fink предоставляет пакет lrzsz
с этим инструментом в Mac OS X. р>
Делать это вики-сообществом, потому что мне будет жаль получать репутацию после того, как Пол приедет первым ...
В школе, если я передаю файл из одной системы Linux в другую, я обычно удаленно использую ssh, а затем использую scp для передачи файла из удаленной системы обратно на мой компьютер. Не уверен, что это то, что вы ищете, или это применимо в вашем случае, но обычно это мой способ обойти необходимость открывать другое окно терминала.
Просто чтобы уточнить, если вы не знакомы с scp, вам все равно придется указать место, куда вы хотели бы поместить файл на свой компьютер, но для меня в любом случае это, как правило, легче запомнить, чем местоположение файла. на удаленном компьютере. Вот ссылка, которая может быть полезна: http://www.computerhope.com/unix/scp .htm р>
https://superuser.com/questions/259481/reverse-scp-over-ssh -связность р>
sftp server
get file.txt
Очевидно, вы также можете перемещаться по n материалам в консоли sftp, и get
принимает полный путь к файлу. Копирует в каталог, из которого вы запустили sftp
.