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

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

<h3>мастер связи</h3><p>это проще всего, если вы планируете заранее.</p><p>откройте мастер-соединение в первый раз. для последующих соединений маршрутизируйте подчиненные соединения через существующее главное соединение. в вашей <a href="http://www.freebsd.org/cgi/man.cgi?query=ssh\_config&sektion=5"><code>~/.ssh/config</code></a> , настройте совместное использование соединения так, чтобы оно происходило автоматически:</p><pre><code>controlmaster auto controlpath ~/.ssh/control:%h:%p:%r </code></pre><p>если вы начнете сеанс ssh с тем же пользователем (пользователь, порт, компьютер), что и с существующим соединением, второй сеанс будет туннелироваться поверх первого. установка второго соединения не требует новой аутентификации и выполняется очень быстро.</p><p>таким образом, пока у вас есть активное соединение, вы можете быстро:</p><ul> <li>скопируйте файл с помощью <code>scp</code> или <code>rsync</code>;</li> <li> <a href="https://unix.stackexchange.com/questions/16206/copy-files-from-remote-server-to-local-ignoring-existing-files-rsync-not-avail/16235#16235">смонтировать удаленную файловую систему с помощью sshfs</a> .</li> </ul><h3>forwarding</h3><p>на существующем соединении вы можете установить обратный туннель ssh. в командной строке ssh создайте удаленную пересылку, передав <code>-r 22042:localhost:22</code> где 22042 - это случайно выбранный номер, который отличается от любого другого номера порта на удаленном компьютере. затем <code>ssh -p 22042 localhost</code> на удаленном компьютере соединяет вас обратно с исходным компьютером; ты можешь использовать <code>scp -p 22042 foo localhost:</code> для копирования файлов.</p><p>вы можете автоматизировать это дальше с помощью <code>remoteforward 22042 localhost:22</code>. проблема в том, что если вы подключаетесь к одному и тому же компьютеру с несколькими экземплярами ssh или если кто-то другой использует порт, вы не получите переадресацию.</p><p>если вы не включили удаленную пересылку с самого начала, вы можете сделать это в существующем сеансе ssh. тип <kbd>enter</kbd> <code>~c</code> <kbd>enter</kbd> <code>-r 22042:localhost:22</code> <kbd>enter</kbd>, см. "escape-символы" в руководстве для получения дополнительной информации.</p><p>также есть некоторая интересная информация в <a href="https://serverfault.com/questions/175798/ssh-back-to-the-local-machine-from-a-remote-ssh-session">эта ветка ошибка сервера</a> .</p><h3>копировать вставить</h3><p>если файл небольшой, вы можете напечатать его и скопировать и вставить из вывода терминала. если файл содержит непечатаемые символы, используйте кодировку, например <a href="http://en.wikipedia.org/wiki/base64">base64</a> .</p><pre> remote.example.net $ base64 <myfile  (скопировать вывод)   local.example.net $ base64 -d> myfile <em> (вставьте содержимое буфера обмена) </em> <kbd>ctrl</kbd>+<kbd>d</kbd> </pre><p>удобнее, если у вас активна переадресация x, скопируйте файл на удаленный компьютер и вставьте его локально. вы можете передавать данные в и из <a href="http://sourceforge.net/projects/xclip/"><code>xclip</code></a> или <a href="http://www.vergenet.net/~conrad/software/xsel/"><code>xsel</code></a> . если вы хотите сохранить имя файла и метаданные, скопируйте и вставьте архив.</p><pre><code>remote.example.net$ tar -czf - myfile | xsel local.example.net$ xsel | tar -xzf - </code></pre>

<p>другим (имо) простым способом будет:</p><pre><code># 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 </code></pre><p>или, если вы предпочитаете что-то похожее на gui, попробуйте <a href="https://www.midnight-commander.org/">midnight commander</a> . они вызывают функцию <em> <a href="http://www.lampdocs.com/how-to-copy-files-via-ssh-using-midnight-commander/">shell-link</a> </em>. большинство дистрибутивов имеют em в своих системах пакетов как <code>mc</code>.</p>

<p>ssh поддерживает несколько команд через escape-символ (<code>~</code> по умолчанию):</p><pre><code>$ ~? 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 </code></pre><p><code>!args</code> кажется наиболее близким к тому, что вы хотите. обратите внимание, что вам нужно включить <code>permitlocalcommand</code> в вашем <code>/etc/ssh\_config</code> файл в порядке для <code>~c</code> команды для работы (см. <code>man ssh\_config</code>).</p><p>вы можете повторно использовать тот же сеанс ssh, если вы установили <code>controlmaster</code> в <code>ssh\_config</code>. если вы делаете это:</p><pre><code>$ ~c ssh> !scp file user@myserver: технически вы никогда не покидали сессию ssh и не должны проходить повторную аутентификацию. возможно, сложнее, чем вы хотели бы, но я не могу придумать другой простой способ.

это все очень сложные методы. вы можете смонтировать удаленную файловую систему на локальном компьютере с помощью sshfs:mkdir -p /mnt/sshfs root@is1300:~# sshfs 192.168.1.2:/ /mnt/sshfs root@is1300:~# umount /mnt/sshfs затем вы можете скопировать и вставить файл с помощью nautilus, gnome, konqueror, dolphin, bash или чего-либо еще.

 используйте <a href="http://matt.ucc.asn.au/ssh-xfer/">ssh-xfer , модифицированный ssh-agent, который эффективно перегружает существующий боковой канал ssh для передачи файлов. используйте <a href="http://zssh.sourceforge.net/">zssh , что эффективно zmodem над ssh. если вы когда-либо использовали rzsz, это покажется вам очень знакомым. обеспечить регресс (-r, для удаленного в локальный) или вперед (-l, для локальных-удаленных) портов для передачи файлов, если у вас есть какой-нибудь демон передачи файлов, прослушивающий на другом конце. но ничего из этого действительно не нужно, имо. протокол ssh поддерживает несколько каналов в одном соединении, а клиент openssh поддерживает мультиплексирование. предполагая, что у вас есть controlmaster и controlpath <a href="http://en.wikibooks.org/wiki/openssh/cookbook/multiplexing">настройка (controlpersist тоже полезно), # первое соединение $ ssh remote <i># будет мультиплексировать через то же соединение, что и исходный ssh</i> $ sftp remote </pre>

<p>еще более простой подход: откройте filezilla (или ваш любимый ftp-браузер), откройте ssh-соединение с тем же сайтом, найдите файл и перетащите его в локальную файловую структуру. если вы новичок в filezilla, воспользуйтесь функцией "менеджер сайтов", чтобы быстро подключиться в следующий раз.</p><p>да, я знаю, что это очевидно для большинства из вас (и не совсем точно), но некоторые (как я), которые нашли этот поток, ищущий решение только для терминала, возможно, упустили очевидное.</p>

<p>то, что я нашел лучшим и наиболее эффективным решением, это использовать <code>xclip-copyfile</code> а также <code>xclip-pastefile</code>.</p><p>на сервере вы используете <code>xclip-copyfile</code> для копирования одного или нескольких файлов. эти файлы затем доступны на вашем локальном сервере. там вы можете использовать <code>xclip-pastefile</code>.</p><p>это обходит необходимость использовать <code>scp</code> или иметь локальный ssh-сервер. я использую это с cygwin, например. единственная проблема заключается в том, что для этого требуется установить <code>xclip</code>, если у вас его еще нет. о, и это работает с двоичными файлами тоже.</p>

<p>одна из многих причин, по которым мы используем <a href="http://www.vandyke.com/products/securecrt/">securecrt</a> - несмотря на то, что предпочитаем программное обеспечение с открытым исходным кодом, где это практически возможно, - это простота передачи файлов. в мире f/oss просто нет прямой замены.</p><p>securecrt начиналась как чистая программа для windows в середине 1990-х, но была портирована на mac os x и linux <a href="http://vandyke.com/aboutus/news/newsletters/2011/nov11\_news.html">пару лет назад</a> .</p><p>securecrt имеет три основных функции для передачи файлов в систему и из системы, в которую вы используете ssh:</p><ul> <li> <p><strong> <a href="http://en.wikipedia.org/wiki/zmodem">zmodem</a> , <a href="http://en.wikipedia.org/wiki/ymodem">ymodem</a> , <a href="http://en.wikipedia.org/wiki/xmodem">xmodem</a> , <a href="http://en.wikipedia.org/wiki/kermit\_%28protocol%29">kermit</a> и ascii </strong> - securecrt - это эмулятор терминала старой школы, поддерживающий несколько внутриполосных протоколов передачи файлов.</p> <p>самым простым в использовании является zmodem. когда вы печатаете что-то вроде <code>sz file-to-download</code> в удаленной командной строке, удаленная <code>sz</code> программа записывает <a href="http://en.wikipedia.org/wiki/escape\_sequence">escape escape</a> , которая сообщает securecrt немедленно начать загрузку <code>file-to-download</code> в каталог загрузки по умолчанию.</p> <p>приятным моментом является то, что каталог загрузки настраивается для каждой сессии. мы используем это, чтобы иметь каталоги для сайтов на нашем файловом сервере в главном офисе, поэтому нам не нужно вручную сортировать загруженные файлы.</p> <p>(<code>sz</code> - это программа "send zmodem", входящая в пакет <a href="http://ohse.de/uwe/software/lrzsz.html"><code>lrzsz</code></a> . она уже упакована для большинства систем unixy. если по какой-либо причине ваша удаленная система не он еще не установлен, и вы не можете легко установить бинарный пакет, исходный пакет небольшой и легко переносимый. несколько раз мне приходилось отправлять <code>lrzsz</code> <a href="http://en.wikipedia.org/wiki/shar">"sharchive) "</a> или <a href="http://en.wikipedia.org/wiki/uuencode"><code>uuencode</code> 'd tarball</a> для урезанной удаленной системы, чтобы я мог zmodem файлы к ней.)</p> </li> <li> <p><strong> [~ # ~] sftp [~ # ~] </strong> - securecrt имеет тесно интегрированную базовую реализацию sftp.</p> <p>под "плотной интеграцией" я подразумеваю, что когда вы даете команду меню sftp или сочетание клавиш, она открывает новую вкладку, подключенную к удаленному сайту через то же соединение ssh. таким образом, вам не нужно снова входить в систему, и соединение устанавливается немного быстрее, чем если бы вы открыли отдельное sftp-соединение с тем же сервером.</p> <p>я характеризую функцию sftp как "базовую", потому что у vandyke software есть отдельный продукт для передачи файлов <a href="http://www.vandyke.com/products/securefx/">securefx</a> . это более функционально, чем встроенный sftp-клиент, а также интегрируется с securecrt.</p> <p>функция sftp securecrt позволяет вам настроить удаленные и локальные каталоги по умолчанию, которые отделены от конфигурации zmodem.</p> <p>эта функция sftp имеет базовый интерфейс командной строки, имитирующий программу openssh <code>sftp</code>, за исключением того, что она имеет такие возможности, как <kbd>tab</kbd> завершение команды. таким образом, получение удаленного файла с именем <code>somefile.tar.gz</code> может быть так же просто, как <code>get so</code><kbd>tab</kbd><kbd>enter</kbd>,.</p> </li> <li> <p><strong> drag-and-drop </strong> - если вы перетаскиваете файл в окно терминала, он автоматически набирает <code>rz</code> для вас и начинает отправку файла.</p> <p>кроме того, вы можете открыть вкладку sftp и перетащить файл на эту вкладку, чтобы отправить его через sftp. таким образом, отправка файла в удаленную систему может быть такой же простой, как <kbd>alt-p</kbd>, <em> перетащить</em>, <em> бросить</em>.</p> <p>мы находим, что передачи происходят намного быстрее через sftp, возможно потому, что это протокол на основе tcp, поэтому он выигрывает от большого <a href="http://en.wikipedia.org/wiki/sliding\_window\_protocol">скользящие окна</a> современного <a href="http://en.wikipedia.org/wiki/internet\_protocol\_suite">стеки tcp/ip</a> . zmodem был разработан во времена, когда размер блока в 64 кб считался "большим". таким образом, большая часть потенциальной скорости в канале поглощается в zmodem, в то время как каждый конец ожидает подтверждения передачи блока.</p> <p>приятной особенностью режима перетаскивания является то, что он снимает одно из стрессов при использовании zmodem. когда вы набираете <code>rz</code> в удаленной системе, securecrt автоматически открывает окно выбора файлов. затем у вас есть около минуты, чтобы найти и выбрать файл до истечения времени ожидания удаленной стороны. это создает атмосферу гонки на часах, которая не нравится. перетаскивание позволяет найти файл на досуге, а затем начать передачу одним быстрым движением мыши.</p> <p>мы по-прежнему используем ручной метод, начиная передачу с явной команды <code>rz</code>. это связано с тем, что securecrt позволяет настраивать каталог загрузки для каждой сессии, который мы указываем на папку на файловом сервере, которая всегда содержит последнюю версию программного обеспечения, которое работает на конкретном удаленном сайте. для таких передач нет гонки на время, так как сборщик файлов открывается в правильном месте для начала.</p> </li> </ul>

<p>используйте "!" преобразовать файл в ascii-представление вашего файла (например, <code>! uuencode myfile.bin >uuencode.dat</code>). тогда используйте <code>! cat uuencode.dat >target.dat</code>. после этого используйте uudecode на целевой стороне: <code>! uudecode target.dat >myfile.bin</code></p>