ssh
[
Пред. ] [ Содержание ] [
След. ]
ssh
Created Пятница 08 Сентябрь 2017
https://linuxsoid.club/ssh-tips-n-tricks НАБОР КОМАНД ДЛЯ РАБОТЫ С SSH НА ВСЕ СЛУЧАИ ЖИЗНИ
1. Возможность быстрого запуска команд Если вы хотите выполнить всего одну удаленную команду, не обязательно подключаться к SSH, вводить команду, а затем отключаться. Можно сделать это сразу. Например, так можно посмотреть заполненность ФС удаленной машины:
ssh user@host df -h А так — перезагрузить ее:
ssh user@host sudo reboot 2. Запуск списка команд Если у тебя есть целый список команд, которые следует выполнить, их можно записать в файл и скормить этот файл SSH:
ssh user@host "`cat file.txt`" 3. Удаленные редактирование файлов локальным редактором Чтобы отредактировать файл на удаленной машине, не обязательно заходить на нее и иcпользовать консольный редактор(vim/nano итд). Вы можете открыть на редактирование файл одним из текстовых редакторов которые установлены у вас на локальной машине (gedit заменяем на свой редактор):
gedit scp://user@host//путь/к/файлу 4. Копирование содержимое удаленного файла в буфер обмена Если вам нужно скопировать содержимое определенного файла который находится на одном из серверов или удаленной машине, не обязательно выводить содержимое на экран или открывать в вашем текстовом редакторе и копировать вручную. Можно поступить более оригинально и скопировать в буфер, используем команду ниже:
ssh user@host cat /путь/к/файлу | xclip Как вариант скопировать вывод команды:
ssh user@host uname -a | xclip 5. Сравнение удаленного и локального файлов без копирования Для данной задачи вы можно использовать небольшой прием, смотрим команду ниже:
ssh user@host cat /путь/к/удаленному/файлу | diff /путь/к/локальному/файлу - 6. Работа с удаленными файлaми используя локальный файловый менеджер Работая с большим количеством файлов, не удобно для этого использовать консольные команды или mc который запущен на удаленной машине. Но вы всегда можно подключить любой из каталогов удаленной машины например
как сетевой диск. Это вы можете осуществить используя утилиту sshfs:
sudo apt install sshfs Создаем каталог для подключения «сетевого диска»:
mkdir remote_files Подключаем каталог:
sshf user@host:/home/user ~/remote_files/ Вот и все, с этого момента все файлы удаленного каталога /home/user вы будете видеть в каталоге ~/remote_files/ где сможете с ними работать, как с обычными файлами на компьютере.
7. Используем tmux Если вам нужно выполнить сложные манипуляции на удaленной машине, это в большей части случаев не ограничиваются одной консолью. Для решения подобных задач мы открываем нeсколько SSH-соединений, в которых выполняем различные команды, копиpуем текст из одной консоли в другую, мониторим выполнение и прочее. Не обязательно держать открытыми несколько сессий, достаточно одной, в которой будет запущен tmux.
Утилита tmux — это так же детище команды разработчиков OpenBSD. Утилита позволяет запускать внутри одной SSH-сессии неограниченное количество консолей, с которыми вы можете работать одновременно, в том числе используя несколько на одном экране. О главном — tmux имеет поддержку функции detach/attach, которая позволяет отключиться от используемой на данный момент сессии tmux, закрыть соединение, подключиться к этой же машине, но уже с другого компьютера и возобновить сессию tmux со всеми открытыми консолями и их содержимым которое было до этого но с другого компьютера, очень удобно.
Tmux в режиме разделения экрана
Утилита Tmux доступна с репозиториев наверное всех популярных дистрибутивов.
8. Как быстро создать и скопировать ключи
ssh-keygen -t rsa Создаем ключ RSA
Копирование публичного ключа на удаленный сервер можно упростить и скопировать ключ в автоматическом режиме:
ssh-copy-id user@host Не обязательно копировать основной ключ, используя флаг
-i можно указать любой другой:
ssh-copy-id -i ~/my_key.pub user@host -i ~/my_key.pub путь к другому ключу
9. Создаем стабильное соединение с машиной Если вы в течение дня часто подключаетесь к одной машине, на несколько минут или секунд (чтобы просто запустить одну команду), с ней можно создать постоянное соединение. Ваш компьютер будет держать соединение открытым и использовать его для каждого подключения к машине. Это намного быстрее и экономичнее с точки зрения трафика и нагрузки на процессор.
Добавьте следующие строки в
~/.ssh/config: Host host ControlPath ~/.ssh/master-%r@%h:%p ControlMaster no А затем создайте соединение:
ssh -MNf user@host 10. Используем версию SSH для неустойчивых соeдинений SSH создан для работы с использованием стабильного соединения и не рассчитан на работу с использованием неустойчивого интернет-соединения, в связи с чем не умеет реагировать на потерю пакетов. Если у вас соединение оборвется, SSH повиснет и будет находиться в таком состоянии, пока не закончится тайм-аут. До тех пор пока вы используете надежное оптоволоконное соединение, это не будет проблемой, но как только вы попадете в условия где нет покрытия кабельного интернета, 3G для вас будет казаться экзотикой, в следствии чего SSH превратится в невыносимо тупой инструмент.
Решить проблему можно используя autossh. Это обертка над SSH, которая позволяет проверять жизнеспособность канала. Autossh создает дополнительное SSH-соединение с сервером и непрерывно шлет по нему heartbeat-пакеты. Если пакет не доходит до адресата, autossh считает канал мертвым и перезапускает SSH-соединение.
Пользоваться очень просто:
sudo apt install autossh autossh -M5000 user@host По дефолту тайм-аут между отправкой heartbeat-пакeтов составляет десять минут, что очень много. Если вы хотите уменьшить тайм-аут пропиши его в переменную AUTOSSH_POLL перед запуском autossh (значение в секундах):
export AUTOSSH_POLL=10 Либо используем вариант еще лучше предыдущего: mosh. Оптимизированная для неустойчивых и низкоскоростных соединений версия SSH, работающая по протоколу UDP. Mosh позволяет получить быстрое и отзывчивое соединение даже на очень медленном канале, из коробки позволяет поднимать упавшее соединения, переключать клиента с одного IP на другой (при переключении с Wi-Fi-соединения на мобильное, например) без перезапуска сессии.
Mosh имеет вcего один недостаток: он требует установки не только на локальную машину, но и на удаленную. Зато после этого ничего настраивaть не нужно, достаточно использовать команду mosh вместо ssh. Более того, mosh уже встроeн в SSH-клиенты JuiceSSH для Android и Blink для iOS.
11. Открываем порт SSH лишь по необходимости Работая с SSH порт вашего сервера в ближайшем будущем станет целью большого количества ботов, которые будут пытаться к нему подключаться или же подобрать пароль, даже если вы отключили аутентификацию по паролю. Как бороться с ботами? Для этой задачи у нас есть два способа: первым способом будет установка утилиты fail2ban которая поможет автоматически отшибать особо надоедливых ботов, второй способ, это конечно же открывать порт только тогда, когда вам это необходимо.
Если вы подключаетесь к серверу нечаcто, второй способ идеален. Идея в том, что на сервер устанавливается специальный демон, который слушает указанные порты и в случае соединения с этими портами в определенном порядке откроет 22-й порт. Другой порядок соединения будет закрывать порт.
Техника называется port knoking и реализуется с помощью демона knockd. Установка демона на сервер:
sudo apt install knockd Настройка демона, добавьте в файл конфиг /etc/knockd.conf следующие строки:
[options] logfile = /var/log/knockd.log [openSSH] sequence = 3000,4000,5000 seq_timeout = 5 command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 5000,4000,3000 seq_timeout = 5 command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn Перезапустим демон:
sudo /etc/init.d/knockd restart Теперь используем следующую команду для подключения к серверу:
knock <host> 3000 4000 5000 && ssh user@host && knock <host> 5000 4000 3000 Она позволит открыть порт перед SSH-соединениeм и закрыть его после закрытия сессии. Стоит обратить внимание, что в настройках брандмауэра SSH-порт должен быть закрыт.
Стучимся в порты
12. Защищаемся от брутфорса Установка fail2ban — второй метод защиты от ботов которые подбирают пароли. Демон Fail2ban, имеет основную задачу, непрерывно мониторить логи сетевых служб (Apache, vsftpd, SSH…) где он проверяет, ищет вредителей которые слишком часто пытаются аутентифицироваться и блокирует их IP (три неудачные попытки подряд и в бан на десять минут).
Преимущество fail2ban в том, что он не нуждается в настройке и начинает работать сразу же после установки. Все, что надо сделать, — это установить пакет:
sudo apt install fail2ban 13. Измеряем скорость соединения Используя SSH, вы можете легко проверить скорость вашего соeдинения с машиной. Для этой задачи можно использовать утилиту pv (pipe viewer). Смотрим пример команды ниже:
yes | pv | ssh user@host "cat > /dev/null" Измеряем скорость соединения
14. Используем SSH как SOCKS-прокси SSH очень легко изменить в SOCKS-прокси, который будет пересылать ваши данные между локальной машиной и SSH-сервером через зашифрованный канал. Для этого вам нужно сделать следующее, — запустить SSH-клиент с флагом -D, пoсле которого указать номер SOCKS-порта (флаг -C включает принудительное сжатие трафика):
ssh -D 9999 -C user@host 15. Обходим файрволы В дополнение к SOCKS-прокси, SSH имеет функцию прозрачного «проброса портов». Работает примерно так: на локальной машине открывается порт. Трафик, который будет передаваться на этот порт, прозрачно проксируется через удалeнную машину и направляется на указанный хост:порт. Приведу пример: ваш твой начальник заблокировал доступ к linuxsoid.com на уровне корпоративного файрвола. Но вы можете обойти это ограничение, используя удаленный SSH-сервер:
ssh -L8080:linuxsoid.com:80 user@host Теперь все подключения к localhost:8080 будут перенаправляться на linuxsoid.com:80.
16. Сохраняем настройки подключения к хостам Если вы работаете с большим количеством хостов используя имя разных юзеров и к всему этому используете разные ключи, вы можете существенно упростишь вашу жизнь, если создадите для этих хоcтов шорткаты. Например, следующие строки ~/.ssh/config описывают два хоста:
site.com, SSH-сервер на кoтором «висит» на порту 2222, а в качестве ключа используется ~/my_key.pem;
192.168.0.1, с SSH-сервером на стандартнoм порту, юзером root и принудительным отключением аутентификации с помощью ключа.
Host server1 HostName site.com Port 2222 User user IdentityFile ~/my_key.pem Host server2 HostName 192.168.0.1 User root PubkeyAuthentication no Теперь, чтобы подключиться к site.com, нет нужды нaбирать длинную команду:
ssh -i ~/my_key.pem user@example.com -p 2222 Вы можете использовать шорткат:
ssh server1 17. Подключаемся к удаленной машине через другую машину Например, у вас есть доступ к host1, но вы не имеете доступа к host2 (он за файрволом), но доступ к host2 имеется у host1. В итоге вы можете подключиться к host2 вот так:
ssh -t user@host1 ssh user@host2 ssh -t nikita@25.80.50.35 ssh tux@192.168.137.5
18. Копиpуем файлы с удаленной машины на другую машину через свою Примерно такая же история как и при подключении к удаленной машине через другой компьютер. У вас есть файл который необходимо скопировать с host1 на host2, но они не могут друг с другом общаться. В данном случае, вы можете скопировать файл используя локальную машину:
ssh root@host1 "cd /копируемый/каталог/ && tar -cf - ." | ssh root@host2 "cd /куда/копировать/ && tar -xf -" 19. Запуск графических приложений Linux/BSD используют ту же клиент-серверную оконную систему X Window System, которая изначально разрабатывалась для запуска графических приложений на мейнфрейме с выводом изображения на экран клиента. Поэтому она из коробки позволяет запускать приложения на удаленной машине так, чтобы их вывoд был перенаправлен на локальную. SSH умеет форвардить протокол X, так что его можно использовать для запуска не только консольных, но графических приложений:
ssh -X user@host firefox 20. Прослушивание музыки с удаленной машины Немного надуманный, но в целом довольно интересный трюк:
ssh user@host "cat /home/user/music/*.mp3" | mpg123 - Своего рода интернет-радио для одного.
www.shellhacks.com/ru/copy-files-ssh-10-examples/
Копируем файл «file.txt» из удаленного сервера на локальный компьютер. $
scp user@remote.host:file.txt /some/local/directory Копируем файл «file.txt» с локального компьютера на удаленный сервер. $
scp file.txt user@remote.host:/some/remote/directory $
scp /home/setapt/progfiles/mining/cpuminer tapust@25.54.97.18:/home/tapust/.minin Копируем папку «dir1» с локального хоста в директорию «dir2» на удаленном хосте. $
scp -r dir1 user@remote.host:/some/remote/directory/dir2 scp -r /home/setapt/progfiles/mining/xmr-stak tapust@25.54.97.18:/home/tapust/.minin scp -r /home/setapt/progfiles/mining/xmr-stak-2.10.7-cpu_cuda tapust@25.54.97.18:/home/tapust/.minin Копируем несколько файлов с удаленного хост в текущую директорию на Вашем локальном хосте.
$
scp user@remote.host:~/\{file1,file2,file3\} .
Копируем файл «file.txt» с локального компьютера в Ваш домашний каталог на удаленном сервере. Увеличиваем скорость работы SCP изменяя алгоритм шифрования с AES-128 (по умолчанию) на Blowfish. $
scp -c blowfish file.txt user@remote.host:~ Копируем файл «file.txt» с локального хоста на удаленный хост, используя порт 2222.
$
scp -P 2222 file.txt user@remote.host:/some/remote/directory Передача звука по сети http://www.opennet.ru/tips/info/2184.shtml ssh user@host "arecord -F 5 -D hw:2,0 -t wav -f dat -c 1 | lame -" | mpg123 - или
ssh user@host "arecord -F 5 -D hw:2,0 -t wav -f dat -c 1 | lame -" > listening.mp3 sshtapust@25.54.97.18 "arecord -F 5 -D hw:2,0 -t wav -f dat -c 1 | lame -" | mpg123 - поднимаем туннель на toshe 192.168.137.10 ssh -f -N -R 2081:192.168.137.10:80 setapt@25.82.123.193 заходим c 25.82.123.193 на toshu из браузера localhost:2081 Магия SSH https://habr.com/post/331348/ SSH-туннели — пробрасываем порт https://habr.com/post/81607/ Настройка Linux
Не всегда есть возможность, да и не всегда надо, строить полноценный туннель с интерфейсной парой адресов. Иногда нам нужно лишь «прокинуть» вполне определённые порты.
Тут важно понимать, что туннель можно организовать как изнутри сети, к ресурсам которой вы хотите получить доступ, на внешний ssh-сервер. Также можно организовать туннель с хоста в Интернете на пограничный ssh-сервер сети, чтобы получить доступ к внутренним ресурсам.
Итак. По-порядку.
Строим туннель из сети в мир.
$ ssh -f -N -R 2222:10.11.12.13:22 username@99.88.77.66 теперь введя на хосте 99.88.77.66:
$ ssh -p2222 localhost мы попадём на хост 10.11.12.13.
Таким-же образом можно получить доступ к любому другому ресурсу, например:
$ ssh -f -N -R 2080:10.11.12.14:80 username@99.88.77.66 Введя на хосте 99.88.77.66:
$ w3m -dump http://localhost:2080 получим дамп web-ресурса на 10.11.12.14.
Строим туннель из мира в сеть.
$ ssh -f -N -L 4080:192.168.0.10:80 nameuser@88.77.66.55 Аналогично, вводим на своём хосте:
$ w3m -dump http://localhost:4080 и получаем доступ к web-ресурсу узла 192.168.0.10, который находится за хостом 88.77.66.55.
Поддерживаем туннели в поднятом состоянии
Ни для кого не секрет, что связь иногда обрывается, туннели при этом будут отваливаться по таймауту.
Чтобы не утруждать себя дополнительным монотонным вбиванием команды на поднятие туннеля и мониторингом этого процесса, автоматизируем его. Смело вводим:
$ crontab -e и создаём расписание примерно следующего вида:
TUNCMD1='ssh -f -N -R 2222:10.11.12.13:22 username@99.88.77.66' TUNCMD2='ssh -f -N -R 2080:10.11.12.14:80 username@99.88.77.66' *
/5 * * * * pgrep -f "$TUNCMD1" &>/dev/null || $TUNCMD1 *
/5 * * * * pgrep -f "$TUNCMD2" &>/dev/null || $TUNCMD2 Сохраняемся. Проверяем по
$ crontab -l что расписание принято.
Это лишь ещё один момент особой админской магии… Надеюсь, что лишних вопросов не должно водникнуть. С дополнительными опциями ssh можно ознакомиться в
$ man 1 ssh По практическому опыту — cron-задания на перезапуск абсолютно недостаточно.
Разве что соединение абсолютно стабильно. В реальной жизни встречается в 0% случаев.
Даже соединённые напрямую кабелем две сетевые карты легко могут потерять n-ное количество пакетов и tcp-соединение «упадёт».
Клиент и сервер будут пребывать в святой уверенности, что всё в порядке, просто вторая сторона ничего не передаёт.
Нужен keepalive.
Примерно так:
TCPKeepAlive yes ServerAliveInterval 300 ServerAliveCountMax 3 Интервал и счётчик — по вкусу.
Добавлять их надо либо в /etc/ssh_config, либо в ~/.ssh/config, либо прямо в команде через опцию -o.
В принципе, судя по man ssh_config, первую из опций можно и опустить. но, на всякий случай, пусть будет.
https://ru.wikibooks.org/wiki/SSH_%D1%82%D1%83%D0%BD%D0%BD%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 Использование веб-браузера
Настройка веб-браузера
Например, в Mozilla Firefox зайдите в Настройки -> Дополнительно -> Сеть -> Соединение
В параметрах соединения установите галочку на "Настроить параметры подключения прокси вручную" и пропишите в опциях:
SOCKS-прокси: localhost
Порт: 12345 (или любой другой неиспользуемый порт)
SSH соединение
SOCKS проксирование
Установите SSH-соединение командой в вашем SSH-клиенте
ssh -D localhost:12345 ваше_имя@адрес_удаленного_компьютера
опция -D адрес:порт задает туннелирование порта. Ее работа заключается в том, что создается сокет для прослушивания порта на локальной машине, привязанный (необязательно) к конкретному адресу. Когда создается соединение к этому порту, это соединение туннелируется по зашифрованному каналу, и протокол приложения затем используется, чтобы определить, куда соединяться с удаленной машиной. При этом SSH работает как SOCKS сервер. (поддерживается 4 и 5я версии протокола)
Переброс локального порта на удаленную машину
Возможно также переадресовывать все соединения на локальный порт через защищенный туннель на удаленную машину. Команда имеет вид:
ssh -L [локальный_адрес:]локальный_порт:удаленный_адрес:удаленный_порт [пользователь@]сервер
После этого все соединения на локальный_адрес:локальный_порт будут переадресовываться удаленному серверу, который будет соединяться с удаленный_адрес:удаленный_порт от своего имени. По умолчанию локальный_адрес соответствует 127.0.0.1. Возможно использование нескольких ключей -L в одном клиенте.
Переброс удаленного порта на локальную машину
Для совершения обратного действия нужно выполнить команду с ключом -R:
ssh -R [удаленный_адрес:]удаленный_порт:локальный_адрес:локальный_порт [пользователь@]сервер
Команда работает также как и в вышеописанном случае только соединения перебрасываются с удаленной машины на локальную.
SSH соединение с PuTTY
Для использования SSH-туннелирования в PuTTY:
В Connection -> SSH -> Tunnels введите
Source port: 12345
Destination: localhost:12345
Установите галочку на "Dynamic" и нажмите кнопку "Add".
В Session введите нужный "Host Name" и выберите протокол SSH. Затем сохраните опции набрав в "Saved Sessions" имя, например, "HostName with ssh tunnel on 12345" и нажмите "Save". Двойным кликом на это имя установите соединение.
Как только SSH-соединение установится, вы можете использовать свой браузер. Зайдя на одну из веб-страниц, где определяется ваш IP адрес, можно убедиться, что он теперь определяется как IP адрес удаленной машины. Поэтому SSH-туннелирование окажется полезным для просмотра статей платных журналов в вашем браузере используя SSH-соединение с университетом, имеющим онлайн подписку на эти журналы. При этом, сохраняя что-либо, вы сохраняете это сразу на ваш локальный компьютер.
https://www.linux.org.ru/forum/admin/13261194 sshd в режиме отладки запускается командой:
/usr/sbin/sshd -p 22 -D -ddd -e arecord -D plughw:1,0 -f dat | ssh -C user@remoteip aplay -f dat
Содержание