В статье мы расскажем, как передать файлы через SSH на разных операционных системах — Windows и Linux.
- Что нужно для подключения
- Как скопировать файл через SSH на Linux
- Как отправить файл по SSH с локального компьютера на сервер
- Как скачать файлы с удаленного сервера на компьютер
- Как скопировать файлы по SSH на Windows
- Как загрузить файл с компьютера на сервер
- Как скачать файл через SSH на локальный компьютер
Для подключения к серверу вам потребуются:
- IP-адрес или имя сервера,
- логин пользователя (в том числе root),
- пароль пользователя,
- порт.
Чаще всего копирование файлов через SSH делают с помощью двух мини-программ:
- scp (Secure Copy) — утилита для Linux. Она позволяет безопасно передать или скачать файл по протоколу SSH. Программа scp входит в комплект OpenSSH и не требует установки.
- pscp.exe — это утилита для Windows. Она используется по тому же назначению, что и scp: подключение к серверу по SSH и работа с файлами. Эта мини-программа входит в состав PuTTY: ее можно скачать на официальном сайте. Процедура настройки SSH-клиента описана в нашей статье.
Важно: если загружаемый файл существует на целевом хосте, он перезапишется.
Работа через SSH предполагает использование консольных команд. Наиболее популярные из них вы можете найти в статье.
Как скопировать файл через SSH на Linux
Копирование файлов по SSH на Linux можно сделать с помощью scp. Эта утилита позволяет:
- передать файл с локального компьютера на удаленный сервер,
- скачать файл с удаленного сервера на локальный компьютер.
Команда scp имеет следующий синтаксис:
scp опция источник получатель
Как отправить файл по SSH с локального компьютера на сервер
Чтобы загрузить файл:
- Подключитесь к серверу по SSH.
- Выполните команду:
scp /home/test.doc username@servername:/directory
Где:
- /home/test.doc — путь к файлу на локальном компьютере;
- username — имя SSH-пользователя;
- servername — имя сервера или его IP-адрес;
- directory — директория на сервере, в которую нужно загрузить файл.
Готово, вы загрузили файл на сервер.
Как скачать файлы с удаленного сервера на компьютер
Чтобы загрузить файл:
- Подключитесь к серверу по SSH.
- Выполните команду:
scp username@servername:/directory/test.doc /home
Где:
- /directory/test.doc — путь к файлу на сервере;
- username — имя SSH-пользователя;
- servername — имя сервера или его IP-адрес;
- home — папка на компьютере, в которую нужно загрузить файл.
Готово, вы скачали файл на компьютер.
Как скопировать файлы по SSH на Windows
Копирование через SSH на ОС Windows выполняется с помощью утилиты pscp.exe из набора PuTTY.
Как загрузить файл с компьютера на сервер
Чтобы загрузить файл:
- Подключитесь к серверу по SSH.
- Выполните команду:
pscp C:/documents/test.doc username@servername:/directory
Где:
- /documents/test.doc — путь к файлу на локальном компьютере;
- username — имя SSH-пользователя;
- servername — имя сервера или его IP-адрес;
- directory — директория на сервере, в которую нужно загрузить файл.
Если название файла или путь содержит пробелы, заключите его в кавычки:
pscp “C:/documents/test 1.doc” username@servername:/directory
Готово, вы загрузили файл на сервер.
Как скачать файл через SSH на локальный компьютер
Чтобы загрузить файл:
- Подключитесь к серверу по SSH.
- Выполните команду:
pscp username@servername:/directory/test.doc C:/documents
Где:
- username — имя SSH-пользователя;
- servername — имя сервера или его IP-адрес;
- directory/test.doc — путь к файлу на сервере;
- /documents — директория на локальном компьютере, в которую нужно загрузить файл.
Если название файла или путь содержит пробелы, заключите его в кавычки:
pscp username@servername:”/directory/test 1.doc” C:/documents
Готово, вы скачали файл на компьютер.
В статье мы расскажем, как копировать файлы в Windows и Linux-системах, и покажем основные команды, с помощью которых происходит передача файлов по SSH.
Для копирования файлов по SSH в Linux-системах и Windows используют разные инструменты:
- scp (Secure CoPy) — утилита для безопасного копирования данных между Linux-системами по протоколу SSH. Она входит в состав OpenSSH, поэтому для работы с утилитой не нужно устанавливать дополнительное ПО;
- pscp.exe — утилита для загрузки файлов по SSH в ОС Windows. Она обладает теми же возможностями, что и scp. Утилита входит в состав программы Putty — SSH-клиента для Windows. Скачать программу можно по ссылке.
Обратите внимание
Если файл, который вы хотите скопировать, уже существует на целевом хосте, при копировании он будет перезаписан.
Копирование файлов по SSH на Linux
Для Linux копирование файлов по SSH происходит с использованием команды scp. С её помощью можно копировать файлы:
- с локального компьютера на удалённый сервер,
- с удалённого сервера на локальный компьютер,
- с одного удалённого сервера на другой.
Общий вид команды:
scp [опция] [источник] [получатель]
Обратите внимание
Для подключения к удалённому серверу вам понадобится логин и пароль пользователя.
Как скопировать файл по SSH с локальной машины на удалённый сервер
Как загрузить файл на сервер по SSH? Для этого используйте команду вида:
scp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Пример команды:
scp /home/test.txt root@123.123.123.123:/directory
Файл test.txt будет скопирован на хост 123.123.123.123 в директорию «/directory».
Как скопировать файлы с удалённого сервера на локальный компьютер
При подключённом SSH скачать файл на локальный компьютер с удалённого сервера можно с помощью команды:
scp [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу] [путь к файлу]
Пример команды:
scp root@123.123.123.123:/home/test.txt /directory
Файл test.txt будет загружен с сервера 123.123.123.123 на локальный компьютер в папку «/directory».
Как скопировать файл по SSH с одного удалённого сервера на другой
Подключитесь по SSH к серверу, на котором расположен файл. Затем выполните команду:
scp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Пример команды:
scp /home/test.txt root@123.123.123.123:/directory
Файл test.txt будет скопирован на хост 123.123.123.123 в директорию «/directory».
Как скачать папку со всеми файлами и подпапками
Если вы хотите скачать папку со всеми файлами и подпапками, используйте ключ -r:
scp -r [источник] [получатель]
Как подключиться к серверу по нестандартному порту
Бывает, что для подключения по SSH нужно указать нестандартный порт. Без указания порта команда подключается к серверу по стандартному 22 порту. Чтобы указать нестандартный порт, введите команду с ключом -P:
scp -P [источник] [получатель]
Пример команды:
scp -P 12345 /home/test.txt root@123.123.123.123:/directory
Эта команда подключается по порту 12345 к серверу 123.123.123.123 и копирует на него файл «test.txt» с локального компьютера в директорию «/directory».
Как передать и скачать файлы по SSH на Windows
Скопировать файл по SSH на сервер можно командой:
pscp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Скачать файл по SSH с сервера командой:
pscp [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу] [путь к файлу]
Увидеть список папок и файлов на сервере можно через pscp.exe. Для этого введите:
pscp -ls [имя пользователя]@[имя сервера/ip-адрес]:[путь]
Если в пути или в названии файла есть пробелы, используйте кавычки:
pscp “C:files or docsfile name” root@123.123.123.123:/home
- Копирование файлов по SSH на Linux
- Как передать и скачать файлы по SSH на Windows
В статье мы расскажем, как копировать файлы в Windows и Linux-системах, и покажем основные команды, с помощью которых происходит передача файлов по SSH.
В Linux и Windows-системах используют разные инструменты для копирования файлов по SSH.
В Linux для копирования данных по протоколу SSH используется утилита scp (Secure CoPy). Она входит в состав OpenSSH, поэтому для работы с утилитой устанавливать дополнительное ПО не нужно.
В Windows для загрузки файлов по SSH используется утилита pscp.exe. Её функционал схож с scp. Утилита входит в состав программы Putty (SSH-клиент для Windows). Putty не входит в стандартный набор Windows-программ, поэтому её нужно будет скачать с официального сайта.
Обратите внимание! Если файл, который вы хотите скопировать, уже существует на целевом хосте, при копировании он будет перезаписан.
Копирование файлов по SSH на Linux
Как скачать файл с сервера через SSH? На Linux копирование файлов по SSH делается с помощью команды scp. Команда может копировать файлы как с локального компьютера на удалённый сервер, так и с удалённого сервера на локальный компьютер.
Обратите внимание! Для подключения к удалённому серверу вам понадобится логин и пароль.
В общем виде команда выглядит так:
scp [опция] [источник] [получатель]
Как скопировать файл по SSH с локальной машины на удалённый сервер
Как загрузить файл на сервер по SSH? Для этой операции используется команда вида:
scp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Например, команда может выглядеть так:
scp /home/test.txt root@123.123.123.123:/directory
То есть файл test.txt будет скопирован на хост 123.123.123.123 в директорию «/directory».
Как скопировать файлы с удалённого сервера на локальный компьютер
При подключённом SSH скачать файл на локальный компьютер с удалённого сервера можно с помощью команды:
scp [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу] [путь к файлу]
Пример команды:
scp root@123.123.123.123:/home/test.txt /directory
То есть файл test.txt будет загружен с сервера 123.123.123.123 на локальный компьютер в папку “/directory”.
Как скачать папку со всеми файлами и подпапками
При необходимости можно скачать папку со всеми файлами и подпапками, для этого используйте ключ -r:
scp -r [источник] [получатель]
Как подключиться к серверу по нестандартному порту
Если не указывать порт, команда подключается к серверу по стандартному 22 порту. Но бывает, что для подключения по SSH нужно указать нестандартный порт. Чтобы это сделать, введите команду с ключём -P:
scp -P [источник] [получатель]
Например, получится такая команда:
scp -P 12345 /home/test.txt root@123.123.123.123:/directory
Указанная команда подключается по порту 12345 к серверу 123.123.123.123 и копирует на него файл «text.txt» в директорию «/directory».
Как передать и скачать файлы по SSH на Windows
Скопировать файл по SSH на сервер можно командой:
pscp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Чтобы скачать файл по SSH с сервера, используйте команду:
pscp [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу] [путь к файлу]
Увидеть список папок и файлов на сервере можно через pscp.exe. Для этого введите:
pscp -ls [имя пользователя]@[имя сервера/ip-адрес]:[путь]
Если в пути или в названии файла есть пробелы, используйте кавычки:
pscp “C:files or docsfile name” root@123.123.123.123:/home
-
Главная
-
Инструкции
-
Linux
-
Копирование файлов по SSH
Протокол SSH (Secure Shell) — это сетевой протокол для удаленного управления операционной системой через командную строку, который можно назвать стандартом для удаленного доступа к *nix-машинам. Позволяет производить защищенный вход на сервер, удаленно выполнять команды, управлять файлами (создавать, удалять, копировать и т.д.) и многое другое. Большинство облачных и хостинг-провайдеров требуют наличие SSH для доступа к своим сервисам. В этой статье рассмотрим копирование файлов по SSH в Windows и Linux-системах.
SSH способен передавать любые данные (звук, видео, данные прикладных протоколов) через безопасный канал связи. В отличие от устаревших и небезопасных протоколов telnet и rlogin, в SSH обеспечивается конфиденциальность передаваемых данных и подлинность взаимодействующих сторон — необходимые условия для сетевого взаимодействия в Интернете.
Рассмотрим алгоритм установки зашифрованного соединения между клиентом и сервером:
- Установка TCP-соединения. По умолчанию сервер слушает 22-й порт. В работе протокола используется набор алгоритмов (сжатие, шифрование, обмен ключами), поэтому стороны обмениваются списком поддерживаемых алгоритмов и договариваются, какие из них будут использовать.
- Чтобы третья сторона не смогла выдать себя за сервер или клиент, стороны должны удостоверится в подлинности друг друга (аутентификация). Для этого используются асимметричные алгоритмы шифрования и пара открытый-закрытый ключ. Вначале проверяется аутентичность сервера. Если соединение происходит впервые, пользователь увидит предупреждение и информацию о сервере. Список доверенных серверов и их ключей записывается в файл по адресу /home/<username>/.ssh/known_hosts.
- Как только клиент убедился в достоверности сервера, стороны генерируют симметричный ключ, с помощью которого происходит шифрования всех обмениваемых данных. Таким образом при перехвате данных, никто, кроме сторон не сможет узнать содержимое сообщений.
- Далее происходит аутентификация пользовательского сеанса. Для этого используется либо пароль, либо присланный клиентом публичный ключ, сохраняемый в файле /home/<username>/.ssh/authorized_keys на сервере.
Самая популярная реализация на Линукс, OpenSSH, предустанавливается практически на всех дистрибутивах: Ubuntu, Debian, RHEL-based и других. На Windows в качестве клиентов можно использовать программы PuTTY, MobaXterm. Начиная с WIndows 10 и Windows Server 2019 инструменты OpenSSH доступны и на Windows.
Подробнее об SSH и работе с ним мы писали в статье «Как пользоваться SSH».
Копирование файлов
Копирование файлов в Linux по SSH осуществляется с помощью двух основных программ: scp и sftp. Обе утилиты поставляются вместе с пакетом OpenSSH. Существуют две основные версии протокола SSH: 1 и 2. Оболочка OpenSSH поддерживает обе версии, однако первая применяется редко.
Настройка автодополнений
При работе с scp крайне удобно использовать tab для автодополнения путей на удаленной машине. Для этого нужно настроить аутентификацию пользователя по публичному ключу.
Для начала сгенерируем открытый и закрытый ключ:
ssh-keygen
Вывод:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:wJQ/XBZq69qXGHxseTuccUEpzWYHhsVVHcDXE3MrTHQ user@host
В конце вывода будет графическое представление ключа (key’s randomart image), которое легче запомнить, чем хэш ключа.
По умолчанию ключи (id_rsa.pub — открытый, id_rsa — закрытый) сохранятся в домашнем каталоге пользователя в директории .ssh. Также во время генерации программа попросит ввести пароль, которым будут защищены ключи. Если не хотите дополнительной защиты, нажмите два раза Enter.
Теперь копируем публичный ключ на удаленную машину:
ssh-copy-id [имя пользователя]@[ip-адрес]
Здесь [имя пользователя] — учетная запись пользователя, под которой будем логиниться на удаленной машине, [ip-адрес] — адрес удаленной машины (можно использовать доменное имя, если они локально резолвится). Далее вводим пароль пользователя. Если все прошло корректно, то в выводе будет команда для удаленного подключения:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '<имя пользователя>@<ip-адрес>'"
and check to make sure that only the key(s) you wanted were added.
Secure copy (SCP)
Для копирования небольших объемов информации (например, конфиги сервисов) лучше всего подойдет утилита scp.
Синтаксис команды для копирования с локальной машины на удаленный сервер:
scp [путь к файлу] [путь к файлу] [имя пользователя]@[ip-адрес]:[путь к файлу]
Попробуем скопировать файл на сервер:
scp test.txt user@192.168.1.29:/home/user/
Вывод:
test.txt 100% 12 20.6KB/s 00:00
Можно передать несколько файлов за раз. Для этого указываем пути, разделенные пробелами:
scp test1.txt test2.txt user@192.168.1.29:/home/user/
Для копирования с удаленного сервера на локальную машину нужно поменять источник и место назначения местами:
scp user@192.168.1.29:/home/user/test.txt ~/
Для передачи директории используйте ключ -r
:
scp -r testdir user@192.168.1.29:/home/user/
Также имеется возможность передачи с одного удаленного сервера на другой:
scp gendo@192.168.1.25:/home/gendo/test.txt user@192.168.1.29:/home/user/
Secure FTP (SFTP)
Еще одной утилитой для передачи файлов, поставляемых в OpenSSH, является sftp. C релизом OpenSSH 9.0 утилита scp переведена по умолчанию на использование SFTP вместо устаревшего протокола SCP/RCP. Sftp работает практически также, как и классический ftp, за исключением того, что в sftp данные передаются не в виде обычного текста, а по зашифрованному туннелю (туннелирование — это процесс упаковки и передачи одного сетевого подключения с помощью другого). Также для работы sftp не нужен отдельный FTP-сервер.
Пример простого скачивания через sftp:
gendo@melhior:~$ sftp misato@192.168.1.29
Connected to 192.168.1.29.
sftp> ls
file.txt file1.txt file2.txt test.txt
sftp> lcd testdir/
sftp> get test.txt
Fetching /home/misato/test.txt to test.txt
test.txt 100% 12 4.8KB/s 00:00
sftp> bye
Сам по себе sftp применяется редко: вместо этого его используют файловые менеджеры, например Midnight Commander и Nautilus:
Использование sftp в файловом менеджере Nautilus. Удаленная машина отображается в виде папки с именем пользователя и IP-адресом.
Копирование файлов по SSH в Windows
Скачать файл с сервера или на сервер в Windows можно с помощью консольной программы pscp, поставляемой вместе с PuTTY. Синтаксис очень похож на обычный scp:
pscp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Для SSH-копирования файлов на сервер, используйте следующую команду:
pscp C:servertest.txt misato@192.168.1.29:/home/misato/
Скачивание файла с сервера на компьютер:
pscp misato@192.168.1.29:/home/misato/test.txt C:file.txt
Увидеть список файлов на сервере можно при помощи опции -ls
:
pscp -ls [имя пользователя]@[ip-адрес]:[путь]
Если в пути или в названии файла есть пробелы, используйте кавычки:
pscp "C:dirbad file name" misato@192.168.1.29:/home/misato
Для получения помощи по команде введите pscp без аргументов.
Заключение
Мы рассмотрели, как копировать файлы на сервер и с сервера с помощью безопасного сетевого протокола SSH. Если вы используете облачные серверы, важно уметь работать с SSH, так как он является стандартом для удаленного доступа к *nix-машинам и будет необходим вам в повседневной работе.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
Иногда все мы сталкиваемся с ситуацией передачи файлов с сервера, на сервер. Легко, удобно и безопасно это делать через SSH. В Linux системах в состав ssh-client входит утилита SCP, а в Windows есть аналогичная утилита PSCP которая входит в состав пакета инструментов PuTTY.
Пример использования SCP на Linux системах
Скачать файл с удаленного сервера на локальный:
scp root@11.22.33.44:/root/file.tar.gz /opt |
scp —P 22 root@11.22.33.44:/root/file.tar.gz /opt |
В командах выше мы указали cкачать файл file.tar.gz находящийся в директории /root на удаленном сервере под пользователем root с IP адресом 11.22.33.44 в папку /opt. И вариант скачивания с указанием порта SSH, в случае, если на сервере изменен стандартный порт SSH.
Загрузить файл на удаленный сервер:
scp file.tar.gz root@11.22.33.44:/root |
scp —P 22 file.tar.gz root@11.22.33.44:/root |
В командах выше мы указали закачать файл file.tar.gz находящийся в текущей директории на удаленный сервер под пользователем root с IP адресом 11.22.33.44 в папку /root. И вариант загрузки с указанием порта SSH. Это необходимо в случае, если на сервере изменен стандартный порт SSH.
Пример использования PSCP на Windows системах
Запускаем командную строку и переходим в папку, где находится программа pscp.exe и копируемый файл.
Скачать файл на локальную сервер:
pscp.exe root@11.22.33.44:/home/user/file.tar.gz . |
pscp.exe —P 22 root@11.22.33.44:/home/user/file.tar.gz . |
В командах выше мы указали cкачать файл file.tar.gz находящийся в директории /root на удаленном сервере под пользователем root с IP адресом 11.22.33.44 в текущий каталог. И вариант скачивания с указанием порта SSH, в случае, если на сервере изменен стандартный порт SSH.
Загрузить файл на удаленный сервер:
pscp.exe file.tar.gz root@11.22.33.44:/root |
pscp.exe —P 22 file.tar.gz root@11.22.33.44:/root |
В командах выше мы указали закачать файл file.tar.gz находящийся в текущей директории на удаленный сервер под пользователем root с IP адресом 11.22.33.44 в папку /root. И вариант загрузки с указанием порта SSH. Это необходимо в случае, если на сервере изменен стандартный порт SSH.
Вот так легко можно скачать или загрузить на сервер файл.
Понравилась или оказалась полезной статья, поблагодари автора
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА
Загрузка…
Что такое SSH
SSH (от англ. Secure Shell – безопасная оболочка) – это сетевой протокол для безопасной передачи данных и удаленного подключения к серверу.
Для чего нужен SSH:
- для удаленного администрирования сервера или локальных сетей,
- для защиты данных при управлении почтовыми службами,
- для сжатия файлов при передачи больших объемов информации,
- для переноса сайтов с одного хостинга на другой,
- для безопасной передачи данных.
Распространенная ситуация использования SSH – загрузка сайта на сервер хостинг-провайдера.
Передача файлов по SSH и подключение с его помощью к серверу осуществляется системными администраторами. Для работы с протоколом потребуются навыки системного администрирования, так как при подключении с помощью SSH вы не увидите привычного рабочего стола компьютера и набора программ. Вам откроется черное окно – командная строка, сюда вводятся команды, которые требуется выполнить.
Как работает SSH
Подключение к серверу по SSH позволяет работать с оборудованием так, как будто вы находитесь непосредственно возле него. Загрузка файлов по SSH осуществляется с помощью двух составляющих: SSH-сервера и SSH-клиента.
Для работы протокола использует открытый порт 22 (по умолчанию) и в случае успешной аутентификации предоставляет доступ администратору. Все запросы, которые вводятся на SSH-клиенте, проходят через защищенный канал связи и доставляются на SSH-сервер.
Чтобы начать передачу данных от клиента к серверу, необходимо установить SSH-соединение – защищенный туннель, по которому информация передается в зашифрованном виде.
Для шифрования используются публичный и частный ключ. Публичный – известен всем, частный – есть только у SSH-клиента и SSH-сервера. Авторизация проходит успешно, когда SSH-сервер получает публичный ключ, находит в своем списке разрешенных подключений клиента и отправляет ему информацию зашифрованную частный ключом. Если сервер получает обратно верную расшифровку, то клиент подключается к серверу.
Отметим, что SSH-сервером может быть не только физический сервер, но и ноутбук или персональный компьютер.
Для установки SSH-соединения требуется специальная программа. Она должна быть установлена и на оборудовании, к которому планируют подключаться и на устройстве, с которого будет выполняться подключение.
Существуют платные и бесплатные SSH-серверы для популярных операционных систем:
- для FreeBSD — OpenSSH:
- для Unix-подобных OC — dropbear, lsh-server, openssh-server:
- для Windows — freeSSHd, copssh, WinSSHD, OpenSSH и другие.
SSH-клиенты также разработаны для всех популярных десктопных и мобильных операционных систем.
- для Unix-подобных OC — openssh-client, putty, ssh, Vinagre;
- для Windows — PuTTY, SecureCRT, ShellGuard. Начиная с версии Windows 10 появилась встроенная программа OpenSSH;
- Linux и MacOS имеют встроенный SSH-клиент, которому не требуется дополнительная настройка;
- для Android — connectBot.
Загрузка файлов через SSH
-
Как скопировать файл по SSH на Linux
Чтобы скопировать файл по SSH потребуется выполнить команду scp Подключение к серверу возможно только при наличии пароля и логина пользователя. Общая команда для скачивания имеет вид:
scp [опция] [источник] [получатель]
После запуска команды введите пароль от указанного удаленного сервера.
Как по SSH скачать файл на локальный компьютер с удаленного сервера
После подключения по SSH введите команду:
scp [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу] [путь к файлу]
Например, команда может выглядеть следующим образом:
scp root@111.111.111.111:/home/example.txt /directory
Она означает, что файл example.txt будет загружен с сервера 111.111.111.112 на локальный компьютер в папку «/directory».
Как загрузить файл на сервер по SSH с локальной машины
Чтобы загрузить файл по SSH на Linux выполните команду:
scp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Предположим, команда выглядит следующим образом:
scp /home/example.txt root@111.111.111.112:/directory
Команду можно расшифровать как: файл example.txt будет скопирован на хост 111.111.111.112 в директорию «/directory».
Как скопировать файл по SSH с одного удаленного сервера на другой
Перед началом передачи данных через SSH подключитесь к серверу, где находится файл и выполните команду:
scp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
Указанная команда может иметь вид:
scp /home/example.txt root@111.111.111.112:/directory
Это значит, что файл example.txt будет скопирован на хост 111.111.111.112 в директорию «/directory».
Как скачать по SSH папку со всеми файлами и подпапками
Для скачивания папки со всеми файлами и подпапками, используйте ключ -r :
scp -r [источник] [получатель]
Например, для скачивания каталога /home/user/buh команда может выглядеть следующим образом:
scp –r /home/user/buh root@111.111.111.112:/root
Как подключиться к серверу по нестандартному порту
Если работа SSH-сервера происходит через нестандартный порт, используйте опцию –P:
scp -P [источник] [получатель]
Например, команда может выглядеть следующим образом:
scp -P 2022 /home/example.txt root@111.111.111.112:/directory
Подключение происходит по порту 2022 к серверу 111.111.111.112, на этот сервер копируется файл example.txt с локального компьютера в директорию «/directory».
Чтобы узнать, какие еще возможности предоставляет команда, запустите scp без параметров и прочтите краткую справку.
-
Как загрузить файл через SSH на Windows
Как происходит загрузка файлов по SSH на Windows? В операционной системе от Microsoft используется утилита pscp.exe. Принцип ее работы схож с командой scp. Утилита pscp.exe изначально добавлена в программу Putty (самый популярный SSH-клиент для Windows). Но сама Putty не включена в набор Windows-программ. Скачать ее можно на официальном сайте.
При работе с операционной системой Windows и SSH-клиентом Putty, формат команд остается такой же как при работе с UX-системами. Меняется название исполняемого файла и используется синтаксис обозначения пути к файлам и каталогам при указании источника или места назначения (сравните: /home/example.txt — для Linux и C:Tempfile.tgz для Windows).
Как скачать файл по SSH через Putty? Открываем командную строку cmd.exe (сочетание клавиш Win+R), переходим в каталог, где расположен файл pscp.exe, набираем команду:
pscp [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу] [путь к файлу]
например,
pscp.exe root@111.111.111.112:C:Tempfile.tgz /root
Загрузить файл на сервер можно командой:
pscp [путь к файлу] [имя пользователя]@[имя сервера/ip-адрес]:[путь к файлу]
например,
pscp.exe C:Tempfile.tgz root@111.111.111.112:/root
Чтобы увидеть список папок и файлов, размещенных на сервере, введите:
pscp -ls [имя пользователя]@[имя сервера/ip-адрес]:[путь]
Если в пути или в названии файла присутствуют пробелы, то обозначьте их двойными кавычками — “Путь к файлу”.
Как и с scp, запуская pscp.exe без заданных параметров, вы можете получить краткую информацию по возможным командам и перечень поддерживаемых модификаторов.
Заключение
SSH — удобный и надежный протокол для работы с удаленными устройствами. Он позволяет безопасно загружать и скачивать необходимую информацию с сервера на компьютер и наоборот. Преимущество SSH – простота использования и универсальность удаленного доступа, наличие ключей шифрования, обеспечивающих высокую степень защиты данных.
Подключение к серверу посредством SSH – один из основных методов управления *nix серверами. Довольно часто возникает необходимость загрузить файл на удаленный сервер, либо выгрузить, и других средств кроме SSH-подключения нет. К счастью, копирование файлов через защищенное соединение – одна из штатных функций этого протокола и реализуется с помощь отдельной команды scp в Linux-системах, либо с помощью pscp.exe, входящей в состав SSH-клиента Putty для операционной системы Windows.
Работаем на ОС семейства Linux
Используем следующий формат команд:
scp [модификатор] [источник] [место_назначения]
Если в качестве источника или места назначения указывается удаленный сервер, то формат параметра такой:
[пользователь]@[сервер]:[путь_к_файлу]
После запуска команды потребуется ввести пароль от указанной учетной записи удаленного сервера.
Если собрать все вместе, то скопировать локальный файл /home/user/file.tgz в домашний каталог пользователя root удаленного сервера 123.123.123.123 можно командой:
scp /home/user/file.tgz root@123.123.123.123:/root
Чтобы скачать этот же файл с удаленного сервера:
scp root@123.123.123.123:/root/file.tgz /home/user
За одну операцию можно скопировать несколько файлов, для этого необходимо указать их в качестве источника, разделив пробелом – местом назначения будет считаться последний указанный параметр. Например, загрузить файлы file1.tgz и file2.tgz из локального каталога на удаленный сервер позволит команда:
scp file1.tgz file2.tgz root@123.123.123.123:/root
Для копирования каталога потребуется задействовать модификатор команды –r. Копируем локальный каталог /home/user/dir на удаленный сервер:
scp –r /home/user/dir root@123.123.123.123:/root
В тех случаях, когда SSH-сервер работает на нестандартном порту, поможет опция –P. Если нужно подключиться через порт 10022:
scp –P 10022 /home/user/file.tgz root@123.123.123.123:/root
Чтобы узнать какие еще модификаторы поддерживает команда, можно просто запустить scp без параметров и прочитать краткую справку.
Работаем на ОС семейства Windows
При использовании операционной системы Windows и Putty в качестве клиента, формат команды остается тот же, меняется только название исполняемого файл и используется синтаксис указания путей к файлам и каталогам Windows при указании источника или места назначения. Запускаем командную строку (cmd.exe) или PowerShell, переходим в каталог, где расположен файл pscp.exe вводим команду:
pscp.exe C:Tempfile.tgz root@123.123.123.123:/root
В случае запуска из какой-либо другой папки понадобится указать полный путь к pscp.exe. Если в каком-либо из путей присутствуют пробелы, используются двойные кавычки — “Путь к файлу”:
“C:Program FilesPuttypscp.exe” C:Tempfile.tgz root@123.123.123.123:/root
Как и в случае с scp, запустив pscp.exe без параметров, можно увидеть краткую справку по синтаксису команды и перечень поддерживаемых модификаторов.
Запуск команд на удаленном сервере через SSH-подключение
Протокол SSH, помимо работы в интерактивном режиме, поддерживает также разовый запуск команд или скриптов на удаленном сервере.
Работаем на ОС семейства Linux
Синтаксис команды:
ssh [пользователь]@[сервер] ‘[команда]’
При запросе вводим пароль указанного пользователя и в консоли получаем вывод команды, если таковой имеется.
Например, получим информацию об установленной на удаленном сервере операционной системе:
ssh root@123.123.123.123 ‘uname -a’
Чтобы запустить несколько команд за одно подключение, можно использовать символ “;” в качестве разделителя. Проверим сетевые настройки и активные сетевые подключения на удаленном сервере:
ssh root@123.123.123.123 ‘ifconfig; netstat -anp tcp’
В случае, если потребуется запустить на удаленном сервере локальный файла сценария, потребуется в SSH-подключении вызвать командный интерпретатор в режиме исполнения сценария (например, bash с ключом -s), и на стандартный ввод передать ему файл сценария. Выглядеть эта конструкция будет так:
ssh root@123.123.123.123 ‘bash -s’ < /home/user/myscript.sh
В результате локальный файл /home/user/myscript.sh исполнится на удаленном сервере.
Запуск команды SSH без параметров позволит ознакомиться с краткой справкой по синтаксису и списком дополнительных модификаторов, которые позволяют расширить функциональность команды.
Работаем на ОС семейства Windows
Если мы подключаемся к удаленному серверу с компьютера, работающего на операционной системе Windows, то нам снова потребуется обратиться к терминальному клиенту Putty, в состав которого входит исполняемый файл plink.exe. Работать с этим файлом необходимо из командной строки (cmd.exe) или из PowerShell.
Для запуска команды на удаленном сервере используется следующий синтаксис:
plink.exe [сервер] -ssh -l [пользователь] “[команда]”
Проверим конфигурацию сетевых интерфейсов:
plink.exe 123.123.123.123 -ssh -l root “ifconfig”
Как и при работе с командой SSH в Linux, plink.exe позволяет использовать “;” в качестве разделителя для запуска нескольких команд:
plink.exe 123.123.123.123 -ssh -l root “ifconfig; netstat -anp tcp”
А запуск команд из локального файла можно реализовать с помощью дополнительного ключа —m:
plink.exe 123.123.123.123 -ssh -l root -m “C:Tempmyscript.sh”
Запустив команду plink.exe без параметров, можно ознакомиться с краткой справкой по синтаксису и списком дополнительных модификаторов команды.
Аverage rating : 4
Оценок: 8
191028
Санкт-Петербург
Литейный пр., д. 26, Лит. А
+7 (812) 403-06-99
700
300
ООО «ИТГЛОБАЛКОМ ЛАБС»
191028
Санкт-Петербург
Литейный пр., д. 26, Лит. А
+7 (812) 403-06-99
700
300
ООО «ИТГЛОБАЛКОМ ЛАБС»
700
300
I am running a putty client on a Windows machine to connect successfully to a Linux box. Now I want to be able to copy a file from the Linux machine under the path /home/ubuntu/myfile
to C:/Users/Anshul/Desktop
on my local computer. The user at the Windows machine is anshul
. I am giving the following command on putty but it is not working:
scp /home/ubuntu/myfile ip_address_of_windows_machine:C:/Users/Anshul/Desktop
I think the path for the Windows machine is wrong. Please help as I have banged my head on a large number of forums but none seem to give correct path for Windows server. Don’t suggest alternate options like WinScp
Guy Avraham
3,3623 gold badges40 silver badges49 bronze badges
asked Apr 19, 2012 at 19:56
5
This one worked for me.
scp /home/ubuntu/myfile username@IP_of_windows_machine:/C:/Users/Anshul/Desktop
answered Mar 12, 2018 at 6:04
emoblazzemoblazz
1,3211 gold badge6 silver badges3 bronze badges
6
Download pscp
from Putty download page, then use it from Windows Command Line CMD
as follows:
pscp username_linux_machine@ip_of_linux_machine:/home/ubuntu/myfile.ext C:UsersNameDownloads
Copying starts once you enter the password for the Linux machine.
ifnotak
3,8673 gold badges21 silver badges35 bronze badges
answered Jun 8, 2016 at 20:49
Hesham EraqiHesham Eraqi
2,4254 gold badges22 silver badges45 bronze badges
3
Try this, it really works.
$ scp username@from_host_ip:/home/ubuntu/myfile /cygdrive/c/Users/Anshul/Desktop
And for copying all files
$ scp -r username@from_host_ip:/home/ubuntu/ *. * /cygdrive/c/Users/Anshul/Desktop
fluffyBatman
6,3543 gold badges22 silver badges24 bronze badges
answered Jun 10, 2014 at 11:57
8
Access from Windows by Git Bash console (also works for CMD and PowerShell):
scp user@ip:/dir1/dir2/file "D:dir1dir2"
Wenfang Du
7,3897 gold badges49 silver badges79 bronze badges
answered Jan 4, 2019 at 13:18
byteprombyteprom
4514 silver badges4 bronze badges
5
You could use something like the following
scp -r linux_username@linux_address:path/to/file path/to/local/directory
This will copy file
to the specified local directory
on the system you are currently working on.
The -r
flag tells scp
to recursively copy if the remote file
is a directory.
answered Feb 16, 2015 at 23:58
AtifAtif
3251 gold badge4 silver badges16 bronze badges
Windows doesn’t support SSH/SCP/SFTP
natively. Are you running an SSH server application on that Windows server? If so, one of the configuration options is probably where the root is, and you would specify paths relative to that root. In any case, check the documentation for the SSH server application you are running in Windows.
Alternatively, use smbclient
to push the file to a Windows share.
George
6,5393 gold badges42 silver badges56 bronze badges
answered Apr 19, 2012 at 19:59
theglaubertheglauber
27.9k7 gold badges29 silver badges46 bronze badges
5
For all, who has installed GiT completly with «Git Bash»: You can just write:
scp login@ip_addres:/location/to/folders/file.tar .
(with space and DOT at the end to copy to current location). Than just add certificate (y), write password and that’s all.
answered Oct 3, 2017 at 12:31
1
Your code isn’t working because c:/ or d:/ is totally wrong for linux just use /mnt/c or/mnt/c
From your local windows10-ubuntu bash use this command:
for download:
(from your remote server folder to d:/ubuntu) :
scp username@ipaddress:/folder/file.txt /mnt/d/ubuntu
Then type your remote server password if there is need.
for upload:
(from d:/ubuntu to remote server ) :
scp /mnt/d/ubuntu/file.txt username@ipaddress:/folder/file.txt
Then type your remote server password if there is need.
note: I tested and it worked.
answered Feb 19, 2019 at 12:09
I had to use pscp like above Hesham’s post once I downloaded and installed putty. I did it to Windows from Linux on Windows so I entered the following:
c:ssl>pscp username@linuxserver:keenan/ssl/* .
This will copy everything in the keenan/ssl folder to the local folder (.) you performed this command from (c:ssl). The keenan/ssl will specify the home folder of the username user, for example the full path would be /home/username/keenan/ssl. You can specify a different folder using a forward slash (/), such as
c:ssl>pscp username@linuxserver:/home/username/keenan/ssl/* .
So you can specify any folder at the root of Linux using :/
.
halfer
19.7k17 gold badges95 silver badges183 bronze badges
answered Dec 14, 2018 at 12:47
To send a file from windows to linux system
scp path-to-file user@ipaddress:/path-to-destination
Example:
scp C:/Users/adarsh/Desktop/Document.txt root@127.0.0.1:/tmp
keep in mind that there need to use forward slash(/) inplace of backward slash() in for the file in windows path else it will show an error
C:UsersadarshDesktopDocument.txt: No such file or directory
.
After executing scp command you will ask for password of root user in linux machine.
There you GO…
To send a file from linux to windows system
scp -r user@ipaddress:/path-to-file path-to-destination
Example:
scp -r root@127.0.0.1:/tmp/Document.txt C:/Users/adarsh/Desktop/
and provide your linux password.
only one you have to add in this command is -r.
Thanks.
answered Mar 15, 2019 at 6:00
ADARSH KADARSH K
5967 silver badges20 bronze badges
Here is the solution to copy files from Linux to Windows using SCP without password by ssh:
-
Install sshpass in Linux machine to skip password prompt
-
Script
sshpass -p 'xxxxxxx' scp /home/user1/*.* testuser@x.x.x.x:/d/test/
Details:
sshpass -p 'password' scp /source_path/*.* windowsusername@windowsMachine_ip:/destination_drive/subfolder/
serenesat
4,59110 gold badges35 silver badges53 bronze badges
answered Aug 28, 2015 at 12:47
As @Hesham Eraqi suggested, it worked for me in this way (transfering from Ubuntu to Windows (I tried to add a comment in that answer but because of reputation, I couldn’t)):
pscp -v -r -P 53670 user@xxx.xxx.xxx.xxx:/data/genetic_map/sample/P2_283/* \Desktop-mojbd3ndcc_01-1940_data
where:
-v
: show verbose messages.
-r
: copy directories recursively.
-P
: connect to specified port.
53670
: the port number to connect the Ubuntu server.
\Desktop-mojbd3ndgenetic_map_data
: I needed to transfer to an external HDD, thus I had to give permissions of sharing to this device.
answered Jun 27, 2019 at 3:37
giannkasgiannkas
1683 silver badges14 bronze badges
Open bash window. Preferably git bash.
write
scp username@remote_ip:/directory_of_file/filename ‘windows_location_you_want_to_store_the_file’
Example:
Suppose your username is jewel
your IP is 176.35.96.32
your remote file location is /usr/local/forme
your filename is logs.zip
and you want to store in your windows PC’s D drive forme folder
then the command will be
scp jewel@176.35.96.32:/usr/local/forme/logs.zip ‘D:/forme’
**Keep the local file directory inside single quote.
answered Apr 7, 2019 at 6:02
ZenithZenith
9371 gold badge8 silver badges21 bronze badges
I know this is old but I was struggling with the same. I haven’t found a way to change directories, but if you just want to work with the C drive, scp defaults to C. To scp from Ubuntu to Windows, I ended up having to use (notice the double back-slashes):
scp /local/file/path user@111.11.11.111:Users\Anshul\Desktop
Hope this helps someone.
Racil Hilan
24.3k13 gold badges49 silver badges52 bronze badges
answered Jul 29, 2016 at 0:35
AcmagAcmag
12 bronze badges
2
Try this:
scp /home/ubuntu/myfile C:usersAnshulDesktop
Pang
9,344146 gold badges85 silver badges121 bronze badges
answered Jan 12, 2013 at 2:50
Corey BurnettCorey Burnett
7,2629 gold badges54 silver badges92 bronze badges
1
If you want to copy paste files from Unix to Windows and Windows to Unix just use filezilla with port 22.
answered Sep 4, 2012 at 7:38
I am running a putty client on a Windows machine to connect successfully to a Linux box. Now I want to be able to copy a file from the Linux machine under the path /home/ubuntu/myfile
to C:/Users/Anshul/Desktop
on my local computer. The user at the Windows machine is anshul
. I am giving the following command on putty but it is not working:
scp /home/ubuntu/myfile ip_address_of_windows_machine:C:/Users/Anshul/Desktop
I think the path for the Windows machine is wrong. Please help as I have banged my head on a large number of forums but none seem to give correct path for Windows server. Don’t suggest alternate options like WinScp
Guy Avraham
3,3623 gold badges40 silver badges49 bronze badges
asked Apr 19, 2012 at 19:56
5
This one worked for me.
scp /home/ubuntu/myfile username@IP_of_windows_machine:/C:/Users/Anshul/Desktop
answered Mar 12, 2018 at 6:04
emoblazzemoblazz
1,3211 gold badge6 silver badges3 bronze badges
6
Download pscp
from Putty download page, then use it from Windows Command Line CMD
as follows:
pscp username_linux_machine@ip_of_linux_machine:/home/ubuntu/myfile.ext C:UsersNameDownloads
Copying starts once you enter the password for the Linux machine.
ifnotak
3,8673 gold badges21 silver badges35 bronze badges
answered Jun 8, 2016 at 20:49
Hesham EraqiHesham Eraqi
2,4254 gold badges22 silver badges45 bronze badges
3
Try this, it really works.
$ scp username@from_host_ip:/home/ubuntu/myfile /cygdrive/c/Users/Anshul/Desktop
And for copying all files
$ scp -r username@from_host_ip:/home/ubuntu/ *. * /cygdrive/c/Users/Anshul/Desktop
fluffyBatman
6,3543 gold badges22 silver badges24 bronze badges
answered Jun 10, 2014 at 11:57
8
Access from Windows by Git Bash console (also works for CMD and PowerShell):
scp user@ip:/dir1/dir2/file "D:dir1dir2"
Wenfang Du
7,3897 gold badges49 silver badges79 bronze badges
answered Jan 4, 2019 at 13:18
byteprombyteprom
4514 silver badges4 bronze badges
5
You could use something like the following
scp -r linux_username@linux_address:path/to/file path/to/local/directory
This will copy file
to the specified local directory
on the system you are currently working on.
The -r
flag tells scp
to recursively copy if the remote file
is a directory.
answered Feb 16, 2015 at 23:58
AtifAtif
3251 gold badge4 silver badges16 bronze badges
Windows doesn’t support SSH/SCP/SFTP
natively. Are you running an SSH server application on that Windows server? If so, one of the configuration options is probably where the root is, and you would specify paths relative to that root. In any case, check the documentation for the SSH server application you are running in Windows.
Alternatively, use smbclient
to push the file to a Windows share.
George
6,5393 gold badges42 silver badges56 bronze badges
answered Apr 19, 2012 at 19:59
theglaubertheglauber
27.9k7 gold badges29 silver badges46 bronze badges
5
For all, who has installed GiT completly with «Git Bash»: You can just write:
scp login@ip_addres:/location/to/folders/file.tar .
(with space and DOT at the end to copy to current location). Than just add certificate (y), write password and that’s all.
answered Oct 3, 2017 at 12:31
1
Your code isn’t working because c:/ or d:/ is totally wrong for linux just use /mnt/c or/mnt/c
From your local windows10-ubuntu bash use this command:
for download:
(from your remote server folder to d:/ubuntu) :
scp username@ipaddress:/folder/file.txt /mnt/d/ubuntu
Then type your remote server password if there is need.
for upload:
(from d:/ubuntu to remote server ) :
scp /mnt/d/ubuntu/file.txt username@ipaddress:/folder/file.txt
Then type your remote server password if there is need.
note: I tested and it worked.
answered Feb 19, 2019 at 12:09
I had to use pscp like above Hesham’s post once I downloaded and installed putty. I did it to Windows from Linux on Windows so I entered the following:
c:ssl>pscp username@linuxserver:keenan/ssl/* .
This will copy everything in the keenan/ssl folder to the local folder (.) you performed this command from (c:ssl). The keenan/ssl will specify the home folder of the username user, for example the full path would be /home/username/keenan/ssl. You can specify a different folder using a forward slash (/), such as
c:ssl>pscp username@linuxserver:/home/username/keenan/ssl/* .
So you can specify any folder at the root of Linux using :/
.
halfer
19.7k17 gold badges95 silver badges183 bronze badges
answered Dec 14, 2018 at 12:47
To send a file from windows to linux system
scp path-to-file user@ipaddress:/path-to-destination
Example:
scp C:/Users/adarsh/Desktop/Document.txt root@127.0.0.1:/tmp
keep in mind that there need to use forward slash(/) inplace of backward slash() in for the file in windows path else it will show an error
C:UsersadarshDesktopDocument.txt: No such file or directory
.
After executing scp command you will ask for password of root user in linux machine.
There you GO…
To send a file from linux to windows system
scp -r user@ipaddress:/path-to-file path-to-destination
Example:
scp -r root@127.0.0.1:/tmp/Document.txt C:/Users/adarsh/Desktop/
and provide your linux password.
only one you have to add in this command is -r.
Thanks.
answered Mar 15, 2019 at 6:00
ADARSH KADARSH K
5967 silver badges20 bronze badges
Here is the solution to copy files from Linux to Windows using SCP without password by ssh:
-
Install sshpass in Linux machine to skip password prompt
-
Script
sshpass -p 'xxxxxxx' scp /home/user1/*.* testuser@x.x.x.x:/d/test/
Details:
sshpass -p 'password' scp /source_path/*.* windowsusername@windowsMachine_ip:/destination_drive/subfolder/
serenesat
4,59110 gold badges35 silver badges53 bronze badges
answered Aug 28, 2015 at 12:47
As @Hesham Eraqi suggested, it worked for me in this way (transfering from Ubuntu to Windows (I tried to add a comment in that answer but because of reputation, I couldn’t)):
pscp -v -r -P 53670 user@xxx.xxx.xxx.xxx:/data/genetic_map/sample/P2_283/* \Desktop-mojbd3ndcc_01-1940_data
where:
-v
: show verbose messages.
-r
: copy directories recursively.
-P
: connect to specified port.
53670
: the port number to connect the Ubuntu server.
\Desktop-mojbd3ndgenetic_map_data
: I needed to transfer to an external HDD, thus I had to give permissions of sharing to this device.
answered Jun 27, 2019 at 3:37
giannkasgiannkas
1683 silver badges14 bronze badges
Open bash window. Preferably git bash.
write
scp username@remote_ip:/directory_of_file/filename ‘windows_location_you_want_to_store_the_file’
Example:
Suppose your username is jewel
your IP is 176.35.96.32
your remote file location is /usr/local/forme
your filename is logs.zip
and you want to store in your windows PC’s D drive forme folder
then the command will be
scp jewel@176.35.96.32:/usr/local/forme/logs.zip ‘D:/forme’
**Keep the local file directory inside single quote.
answered Apr 7, 2019 at 6:02
ZenithZenith
9371 gold badge8 silver badges21 bronze badges
I know this is old but I was struggling with the same. I haven’t found a way to change directories, but if you just want to work with the C drive, scp defaults to C. To scp from Ubuntu to Windows, I ended up having to use (notice the double back-slashes):
scp /local/file/path user@111.11.11.111:Users\Anshul\Desktop
Hope this helps someone.
Racil Hilan
24.3k13 gold badges49 silver badges52 bronze badges
answered Jul 29, 2016 at 0:35
AcmagAcmag
12 bronze badges
2
Try this:
scp /home/ubuntu/myfile C:usersAnshulDesktop
Pang
9,344146 gold badges85 silver badges121 bronze badges
answered Jan 12, 2013 at 2:50
Corey BurnettCorey Burnett
7,2629 gold badges54 silver badges92 bronze badges
1
If you want to copy paste files from Unix to Windows and Windows to Unix just use filezilla with port 22.
answered Sep 4, 2012 at 7:38
abstract: В статье описаны продвинутые функций OpenSSH, которые позволяют сильно упростить жизнь системным администраторам и программистам, которые не боятся шелла. В отличие от большинства руководств, которые кроме ключей и -L/D/R опций ничего не описывают, я попытался собрать все интересные фичи и удобства, которые с собой несёт ssh.
Предупреждение: пост очень объёмный, но для удобства использования я решил не резать его на части.
Оглавление:
- управление ключами
- копирование файлов через ssh
- Проброс потоков ввода/вывода
- Монтирование удалённой FS через ssh
- Удалённое исполнение кода
- Алиасы и опции для подключений в .ssh/config
- Опции по-умолчанию
- Проброс X-сервера
- ssh в качестве socks-proxy
- Проброс портов — прямой и обратный
- Реверс-сокс-прокси
- туннелирование L2/L3 трафика
- Проброс агента авторизации
- Туннелирование ssh через ssh сквозь недоверенный сервер (с большой вероятностью вы этого не знаете)
Управление ключами
Теория в нескольких словах: ssh может авторизоваться не по паролю, а по ключу. Ключ состоит из открытой и закрытой части. Открытая кладётся в домашний каталог пользователя, «которым» заходят на сервер, закрытая — в домашний каталог пользователя, который идёт на удалённый сервер. Половинки сравниваются (я утрирую) и если всё ок — пускают. Важно: авторизуется не только клиент на сервере, но и сервер по отношению к клиенту (то есть у сервера есть свой собственный ключ). Главной особенностью ключа по сравнению с паролем является то, что его нельзя «украсть», взломав сервер — ключ не передаётся с клиента на сервер, а во время авторизации клиент доказывает серверу, что владеет ключом (та самая криптографическая магия).
Генерация ключа
Свой ключ можно сгенерировать с помощью команды ssh-keygen. Если не задать параметры, то он сохранит всё так, как надо.
Ключ можно закрыть паролем. Этот пароль (в обычных графических интерфейсах) спрашивается один раз и сохраняется некоторое время. Если пароль указать пустым, он спрашиваться при использовании не будет. Восстановить забытый пароль невозможно.
Сменить пароль на ключ можно с помощью команды ssh-keygen -p.
Структура ключа
(если на вопрос про расположение ответили по-умолчанию).
~/.ssh/id_rsa.pub — открытый ключ. Его копируют на сервера, куда нужно получить доступ.
~/.ssh/id_rsa — закрытый ключ. Его нельзя никому показывать. Если вы в письмо/чат скопипастите его вместо pub, то нужно генерировать новый ключ. (Я не шучу, примерно 10% людей, которых просишь дать ssh-ключ постят id_rsa, причём из этих десяти процентов мужского пола 100%).
Копирование ключа на сервер
В каталоге пользователя, под которым вы хотите зайти, если создать файл ~/.ssh/authorized_keys и положить туда открытый ключ, то можно будет заходить без пароля. Обратите внимание, права на файл не должны давать возможность писать в этот файл посторонним пользователям, иначе ssh его не примет. В ключе последнее поле — user@machine. Оно не имеет никакого отношения к авторизации и служит только для удобства определения где чей ключ. Заметим, это поле может быть поменяно (или даже удалено) без нарушения структуры ключа.
Если вы знаете пароль пользователя, то процесс можно упростить. Команда ssh-copy-id user@server позволяет скопировать ключ не редактируя файлы вручную.
Замечание: Старые руководства по ssh упоминают про authorized_keys2. Причина: была первая версия ssh, потом стала вторая (текущая), для неё сделали свой набор конфигов, всех это очень утомило, и вторая версия уже давным давно переключилась на версии без всяких «2». То есть всегда authorized_keys и не думать о разных версиях.
Если у вас ssh на нестандартном порту, то ssh-copy-id требует особого ухищрения при работе: ssh-copy-id '-p 443 user@server'
(внимание на кавычки).
Ключ сервера
Первый раз, когда вы заходите на сервер, ssh вас спрашивает, доверяете ли вы ключу. Если отвечаете нет, соединение закрывается. Если да — ключ сохраняется в файл ~/.ssh/known_hosts. Узнать, где какой ключ нельзя (ибо несекьюрно).
Если ключ сервера поменялся (например, сервер переустановили), ssh вопит от подделке ключа. Обратите внимание, если сервер не трогали, а ssh вопит, значит вы не на тот сервер ломитесь (например, в сети появился ещё один компьютер с тем же IP, особо этим страдают всякие локальные сети с 192.168.1.1, которых в мире несколько миллионов). Сценарий «злобной man in the middle атаки» маловероятен, чаще просто ошибка с IP, хотя если «всё хорошо», а ключ поменялся — это повод поднять уровень паранойи на пару уровней (а если у вас авторизация по ключу, а сервер вдруг запросил пароль — то паранойю можно включать на 100% и пароль не вводить).
Удалить известный ключ сервера можно командой ssh-keygen -R server. При этом нужно удалить ещё и ключ IP (они хранятся раздельно): ssh-keygen -R 127.0.0.1.
Ключ сервера хранится в /etc/ssh/ssh_host_rsa_key и /etc/ssh/ssh_host_rsa_key.pub. Их можно:
а) скопировать со старого сервера на новый.
б) сгенерировать с помощью ssh-keygen. Пароля при этом задавать не надо (т.е. пустой). Ключ с паролем ssh-сервер использовать не сможет.
Заметим, если вы сервера клонируете (например, в виртуалках), то ssh-ключи сервера нужно обязательно перегенерировать.
Старые ключи из know_hosts при этом лучше убрать, иначе ssh будет ругаться на duplicate key.
Копирование файлов
Передача файлов на сервер иногда может утомлять. Помимо возни с sftp и прочими странными вещами, ssh предоставляет нам команду scp, которая осуществляет копирование файла через ssh-сессию.
scp path/myfile user@8.8.8.8:/full/path/to/new/location/
Обратно тоже можно:
scp user@8.8.8.8:/full/path/to/file /path/to/put/here
Fish warning: Не смотря на то, что mc умеет делать соединение по ssh, копировать большие файлы будет очень мучительно, т.к. fish (модуль mc для работы с ssh как с виртуальной fs) работает очень медленно. 100-200кб — предел, дальше начинается испытание терпения. (Я вспомнил свою очень раннюю молодость, когда не зная про scp, я копировал ~5Гб через fish в mc, заняло это чуть больше 12 часов на FastEthernet).
Возможность копировать здорово. Но хочется так, чтобы «сохранить как» — и сразу на сервер. И чтобы в графическом режиме копировать не из специальной программы, а из любой, привычной.
Так тоже можно:
sshfs
Теория: модуль fuse позволяет «экспортировать» запросы к файловой системе из ядра обратно в userspace к соответствующей программе. Это позволяет легко реализовывать «псевдофайловые системы». Например, мы можем предоставить доступ к удалённой файловой системе через ssh так, что все локальные приложения (за малым исключением) не будут ничего подозревать.
Собственно, исключение: O_DIRECT не поддерживается, увы (это проблема не sshfs, это проблема fuse вообще).
Использование: установить пакет sshfs (сам притащит за собой fuse).
Собственно, пример моего скрипта, который монтирует desunote.ru (размещающийся у меня на домашнем комьютере — с него в этой статье показываются картинки) на мой ноут:
#!/bin/bash sshfs desunote.ru:/var/www/desunote.ru/ /media/desunote.ru -o reconnect
Делаем файл +x, вызываем, идём в любое приложение, говорим сохранить и видим:
Параметры sshfs, которые могут оказаться важными: -o reconnect (говорит пытаться пересоединиться вместо ошибок).
Если вы много работаете с данными от рута, то можно (нужно) сделать idmap:
-o idmap=user. Работает она следующим образом: если мы коннектимся как пользователь pupkin@server, а локально работаем как пользователь vasiliy, то мы говорим «считать, что файлы pupkin, это файлы vasiliy». ну или «root», если мы коннектимся как root.
В моём случае idmap не нужен, так как имена пользователей (локальное и удалённое) совпадают.
Заметим, комфортно работать получается только если у нас есть ssh-ключик (см. начало статьи), если нет — авторизация по паролю выбешивает на 2-3 подключение.
Отключить обратно можно командой fusermount -u /path, однако, если соединение залипло (например, нет сети), то можно/нужно делать это из-под рута: sudo umount -f /path.
Удалённое исполнение кода
ssh может выполнить команду на удалённом сервере и тут же закрыть соединение. Простейший пример:
ssh user@server ls /etc/
Выведет нам содержимое /etc/ на server, при этом у нас будет локальная командная строка.
Некоторые приложения хотят иметь управляющий терминал. Их следует запускать с опцией -t:
ssh user@server -t remove_command
Кстати, мы можем сделать что-то такого вида:
ssh user@server cat /some/file|awk '{print $2}' |local_app
Это нас приводит следующей фиче:
Проброс stdin/out
Допустим, мы хотим сделать запрос к программе удалённо, а потом её вывод поместить в локальный файл
ssh user@8.8.8.8 command >my_file
Допустим, мы хотим локальный вывод положить удалённо
mycommand |scp — user@8.8.8.8:/path/remote_file
Усложним пример — мы можем прокидывать файлы с сервера на сервер: Делаем цепочку, чтобы положить stdin на 10.1.1.2, который нам не доступен снаружи:
mycommand | ssh user@8.8.8.8 «scp — user@10.1.1.2:/path/to/file»
Есть и вот такой головоломный приём использования pipe’а (любезно подсказали в комментариях в жж):
tar -c * | ssh user@server "cd && tar -x"
Tar запаковывает файлы по маске локально, пишет их в stdout, откуда их читает ssh, передаёт в stdin на удалённом сервере, где их cd игнорирует (не читает stdin), а tar — читает и распаковывает. Так сказать, scp для бедных.
Алиасы
Скажу честно, до последнего времени не знал и не использовал. Оказались очень удобными.
В более-менее крупной компании часто оказывается, что имена серверов выглядят так: spb-MX-i3.extrt.int.company.net. И пользователь там не равен локальному. То есть логиниться надо так: ssh ivanov_i@spb-MX-i3.extrt.int.company.net. Каждый раз печатать — туннельных синдромов не напасёшься. В малых компаниях проблема обратная — никто не думает о DNS, и обращение на сервер выглядит так: ssh root@192.168.1.4. Короче, но всё равно напрягает. Ещё большая драма, если у нас есть нестандартный порт, и, например, первая версия ssh (привет цискам). Тогда всё выглядит так: ssh -1 -p 334 vv_pupkin@spb-MX-i4.extrt.int.company.net. Удавиться. Про драму с scp даже рассказывать не хочется.
Можно прописать общесистемные alias’ы на IP (/etc/hosts), но это кривоватый выход (и пользователя и опции всё равно печатать). Есть путь короче.
Файл ~/.ssh/config позволяет задать параметры подключения, в том числе специальные для серверов, что самое важное, для каждого сервера своё. Вот пример конфига:
Host ric Hostname ооо-рога-и-копыта.рф User Администратор ForwardX11 yes Compression yes Host home Hostname myhome.dyndns.org User vasya PasswordAuthentication no
Все доступные для использования опции можно увидеть в man ssh_config (не путать с sshd_config).
Опции по умолчанию
По подсказке UUSER: вы можете указать настройки соединения по умолчанию с помощью конструкции Host *, т.е., например:
Host * User root Compression yes
То же самое можно сделать и в /etc/ssh/ssh_config (не путать с /etc/ssh/sshd_config), но это требует прав рута и распространяется на всех пользователей.
Проброс X-сервера
Собственно, немножко я проспойлерил эту часть в примере конфига выше. ForwardX11 — это как раз оно.
Теория: Графические приложения в юникс обычно используют X-сервер (wayland в пути, но всё ещё не готов). Это означает, что приложение запускается и подключается к X-серверу для рисования. Иными словами, если у вас есть голый сервер без гуя и есть локальный x-сервер (в котором вы работаете), то вы можете дать возможность приложениям с сервера рисовать у вас на рабочем столе. Обычно подключение к удалённом X-серверу — не самая безопасная и тривиальная вещь. SSH позволяет упростить этот процесс и сделать его совсем безопасным. А возможность жать трафик позволяет ещё и обойтись меньшим трафиком (т.е. уменьшить утилизацию канала, то есть уменьшить ping (точнее, latency), то есть уменьшить лаги).
Ключики: -X — проброс X-сервера. -Y проброс авторизации.
Достаточно просто запомнить комбинацию ssh -XYC user@SERVER.
В примере выше (названия компании вымышленные) я подключаюсь к серверу ооо-рога-и-копыта.рф не просто так, а с целью получить доступ к windows-серверу. Безопасность microsoft при работе в сети мы все хорошо знаем, так что выставлять наружу голый RDP неуютно. Вместо этого мы подключаемся к серверу по ssh, а дальше запускаем там команду rdesktop:
ssh ric
rdesktop -k en-us 192.168.1.1 -g 1900x1200
и чудо, окошко логина в windows на нашем рабочем столе. Заметим, тщательно зашифрованное и неотличимое от обычного ssh-трафика.
Socks-proxy
Когда я оказываюсь в очередной гостинице (кафе, конференции), то местный wifi чаще всего оказывается ужасным — закрытые порты, неизвестно какой уровень безопасности. Да и доверия к чужим точкам доступа не особо много (это не паранойя, я вполне наблюдал как уводят пароли и куки с помощью банального ноутбука, раздающего 3G всем желающим с названием близлежащей кафешки (и пишущего интересное в процессе)).
Особые проблемы доставляют закрытые порты. То джаббер прикроют, то IMAP, то ещё что-нибудь.
Обычный VPN (pptp, l2tp, openvpn) в таких ситуациях не работает — его просто не пропускают. Экспериментально известно, что 443ий порт чаще всего оставляют, причём в режиме CONNECT, то есть пропускают «как есть» (обычный http могут ещё прозрачно на сквид завернуть).
Решением служит socks-proxy режим работы ssh. Его принцип: ssh-клиент подключается к серверу и слушает локально. Получив запрос, он отправляет его (через открытое соединение) на сервер, сервер устанавливает соединение согласно запросу и все данные передаёт обратно ssh-клиенту. А тот отвечает обратившемуся. Для работы нужно сказать приложениям «использовать socks-proxy». И указать IP-адрес прокси. В случае с ssh это чаще всего localhost (так вы не отдадите свой канал чужим людям).
Подключение в режиме sock-proxy выглядит так:
ssh -D 8080 user@server
В силу того, что чужие wifi чаще всего не только фиговые, но и лагливые, то бывает неплохо включить опцию -C (сжимать трафик). Получается почти что opera turbo (только картинки не жмёт). В реальном сёрфинге по http жмёт примерно в 2-3 раза (читай — если вам выпало несчастье в 64кбит, то вы будете мегабайтные страницы открывать не по две минуты, а секунд за 40. Фигово, но всё ж лучше). Но главное: никаких украденных кук и подслушанных сессий.
Я не зря сказал про закрытые порты. 22ой порт закрывают ровно так же, как «не нужный» порт джаббера. Решение — повесить сервер на 443-й порт. Снимать с 22 не стоит, иногда бывают системы с DPI (deep packet inspection), которые ваш «псевдо-ssl» не пустят.
Вот так выглядит мой конфиг:
/etc/ssh/sshd_config:
(фрагмент)
Port 22
Port 443
А вот кусок ~/.ssh/config с ноутбука, который описывает vpn
Host vpn Hostname desunote.ru User vasya Compression yes DynamicForward 127.1:8080 Port 443
(обратите внимание на «ленивую» форму записи localhost — 127.1, это вполне себе законный метод написать 127.0.0.1)
Проброс портов
Мы переходим к крайне сложной для понимания части функционала SSH, позволяющей осуществлять головоломные операции по туннелированию TCP «из сервера» и «на сервер».
Для понимания ситуации все примеры ниже будут ссылаться на вот эту схему:
Комментарии: Две серые сети. Первая сеть напоминает типичную офисную сеть (NAT), вторая — «гейтвей», то есть сервер с белым интерфейсом и серым, смотрящим в свою собственную приватную сеть. В дальнейших рассуждениях мы полагаем, что «наш» ноутбук — А, а «сервер» — Б.
Задача
: у нас локально запущено приложение, нам нужно дать возможность другому пользователю (за пределами нашей сети) посмотреть на него.
Решение: проброс локального порта (127.0.0.1:80) на публично доступный адрес. Допустим, наш «публично доступный» Б занял 80ый порт чем-то полезным, так что пробрасывать мы будем на нестандартный порт (8080).
Итоговая конфигурация: запросы на 8.8.8.8:8080 будут попадать на localhost ноутбука А.
ssh -R 127.1:80:8.8.8.8:8080 user@8.8.8.8
Опция -R позволяет перенаправлять с удалённого (Remote) сервера порт на свой (локальный).
Важно: если мы хотим использовать адрес 8.8.8.8, то нам нужно разрешить GatewayPorts в настройках сервера Б.
Задача
. На сервере «Б» слушает некий демон (допустим, sql-сервер). Наше приложение не совместимо с сервером (другая битность, ОС, злой админ, запрещающий и накладывающий лимиты и т.д.). Мы хотим локально получить доступ к удалённому localhost’у.
Итоговая конфигурация: запросы на localhost:3333 на ‘A’ должны обслуживаться демоном на localhost:3128 ‘Б’.
ssh -L 127.1:3333:127.1:3128 user@8.8.8.8
Опция -L позволяет локальные обращения (Local) направлять на удалённый сервер.
Задача
: На сервере «Б» на сером интерфейсе слушает некий сервис и мы хотим дать возможность коллеге (192.168.0.3) посмотреть на это приложение.
Итоговая конфигурация: запросы на наш серый IP-адрес (192.168.0.2) попадают на серый интерфейс сервера Б.
ssh -L 192.168.0.2:8080:10.1.1.1:80 user@8.8.8.8
Вложенные туннели
Разумеется, туннели можно перенаправлять.
Усложним задачу: теперь нам хочется показать коллеге приложение, запущенное на localhost на сервере с адресом 10.1.1.2 (на 80ом порту).
Решение сложно:
ssh -L 192.168.0.2:8080:127.1:9999 user@8.8.8.8 ssh -L 127.1:9999:127.1:80 user2@10.1.1.2
Что происходит? Мы говорим ssh перенаправлять локальные запросы с нашего адреса на localhost сервера Б и сразу после подключения запустить ssh (то есть клиента ssh) на сервере Б с опцией слушать на localhost и передавать запросы на сервер 10.1.1.2 (куда клиент и должен подключиться). Порт 9999 выбран произвольно, главное, чтобы совпадал в первом вызове и во втором.
Реверс-сокс-прокси
Если предыдущий пример вам показался простым и очевидным, то попробуйте догадаться, что сделает этот пример:
ssh -D 8080 -R 127.1:8080:127.1:8080 user@8.8.8.8 ssh -R 127.1:8080:127.1:8080 user@10.1.1.2
Если вы офицер безопасности, задача которого запретить использование интернета на сервере 10.1.1.2, то можете начинать выдёргивать волосы на попе, ибо эта команда организует доступ в интернет для сервера 10.1.1.2 посредством сокс-прокси, запущенного на компьютере «А». Трафик полностью зашифрован и неотличим от любого другого трафика SSH. А исходящий трафик с компьютера с точки зрения сети «192.168.0/24» не отличим от обычного трафика компьютера А.
Туннелирование
Если к этому моменту попа отдела безопасности не сияет лысиной, а ssh всё ещё не внесён в список врагов безопасности номер один, вот вам окончательный убийца всего и вся: туннелирование IP или даже ethernet. В самых радикальных случаях это позволяет туннелировать dhcp, заниматься удалённым arp-спуфингом, делать wake up on lan и прочие безобразия второго уровня.
Подробнее описано тут: www.khanh.net/blog/archives/51-using-openSSH-as-a-layer-2-ethernet-bridge-VPN.html
(сам я увы, таким не пользовался).
Легко понять, что в таких условиях невозможно никаким DPI (deep packet inspection) отловить подобные туннели — либо ssh разрешён (читай — делай что хочешь), либо ssh запрещён (и можно смело из такой компании идиотов увольняться не ощущая ни малейшего сожаления).
Проброс авторизации
Если вы думаете, что на этом всё, то…… впрочем, в отличие от автора, у которого «снизу» ещё не написано, читатель заранее видит, что там снизу много букв и интриги не получается.
OpenSSH позволяет использовать сервера в качестве плацдарма для подключения к другим серверам, даже если эти сервера недоверенные и могут злоупотреблять чем хотят.
Для начала о простом пробросе авторизации.
Повторю картинку:
Допустим, мы хотим подключиться к серверу 10.1.1.2, который готов принять наш ключ. Но копировать его на 8.8.8.8 мы не хотим, ибо там проходной двор и половина людей имеет sudo и может шариться по чужим каталогам. Компромиссным вариантом было бы иметь «другой» ssh-ключ, который бы авторизовывал user@8.8.8.8 на 10.1.1.2, но если мы не хотим пускать кого попало с 8.8.8.8 на 10.1.1.2, то это не вариант (тем паче, что ключ могут не только поюзать, но и скопировать себе «на чёрный день»).
ssh предлагает возможность форварда ssh-агента (это такой сервис, который запрашивает пароль к ключу). Опция ssh -A пробрасывает авторизацию на удалённый сервер.
Вызов выглядит так:
ssh -A user@8.8.8.8 ssh user2@10.1.1.2
Удалённый ssh-клиент (на 8.8.8.8) может доказать 10.1.1.2, что мы это мы только если мы к этому серверу подключены и дали ssh-клиенту доступ к своему агенту авторизации (но не ключу!).
В большинстве случаев это прокатывает.
Однако, если сервер совсем дурной, то root сервера может использовать сокет для имперсонализации, когда мы подключены.
Есть ещё более могучий метод — он превращает ssh в простой pipe (в смысле, «трубу») через которую насквозь мы осуществляем работу с удалённым сервером.
Главным достоинством этого метода является полная независимость от доверенности промежуточного сервера. Он может использовать поддельный ssh-сервер, логгировать все байты и все действия, перехватывать любые данные и подделывать их как хочет — взаимодействие идёт между «итоговым» сервером и клиентом. Если данные оконечного сервера подделаны, то подпись не сойдётся. Если данные не подделаны, то сессия устанавливается в защищённом режиме, так что перехватывать нечего.
Эту клёвую настройку я не знал, и раскопал её redrampage.
Настройка завязана на две возможности ssh: опцию -W (превращающую ssh в «трубу») и опцию конфига ProxyCommand (опции командной строки, вроде бы нет), которая говорит «запустить программу и присосаться к её stdin/out». Опции эти появились недавно, так что пользователи centos в пролёте.
Выглядит это так (циферки для картинки выше):
.ssh/config:
Host raep HostName 10.1.1.2 User user2 ProxyCommand ssh -W %h:%p user@8.8.8.8
Ну а подключение тривиально: ssh raep
.
Повторю важную мысль: сервер 8.8.8.8 не может перехватить или подделать трафик, воспользоваться агентом авторизации пользователя или иным образом изменить трафик. Запретить — да, может. Но если разрешил — пропустит через себя без расшифровки или модификации. Для работы конфигурации нужно иметь свой открытый ключ в authorized_keys как для user@8.8.8.8, так и в user2@10.1.1.2
Разумеется, подключение можно оснащать всеми прочими фенечками — прокидыванием портов, копированием файлов, сокс-прокси, L2-туннелями, туннелированием X-сервера и т.д.
Финал
Разумеется, в посте про туннели должен быть туннель, а в любой успешной статье — секретный ингредиент всеобщей популярности. Держите: