Как выполнять команды Linux в удаленной системе через SSH
Обзор
Нам часто приходится работать с удаленными системами Linux. Мы входим на удаленный хост, выполняем работу и выходим из сеанса. Можем ли мы выполнить все эти действия с локальной машины? Да, это возможно, и это руководство демонстрирует это с исчерпывающими примерами.
Выполнение команд по SSH
SSH позволяет нам выполнять команду на удаленном компьютере без входа в систему. В этом уроке мы обсудим различные способы достижения этого.
Выполнить одиночную команду
Давайте выполним команду uname по SSH.
$ ssh infoit@192.168.10.10 uname
Если вы заметили приведенную выше команду, она похожа на обычную команду SSH с небольшими отличиями. Мы добавили команду для выполнения (выделена красным цветом).
Когда мы выполняем эту команду. Он сгенерирует следующий вывод:
Linux
Выполнить несколько команд
Используя эту технику, мы можем выполнять несколько команд, используя один сеанс SSH. Нам просто нужно разделить команды точкой с запятой (;).
$ ssh infoit@192.168.10.10 "uname;hostname;date"
Как и ожидалось, эти команды будут генерировать следующий вывод:
Linux linux-server Thu Mar 1 15:47:59 IST 2018
Выполнить команду с повышенными привилегиями
Иногда нам нужно выполнить команду с повышенными привилегиями, в этом случае мы можем использовать ее с sudo.
$ ssh -t infoit@192.168.10.10 sudo touch /etc/banner.txt
Обратите внимание, что мы использовали опцию « -t » с SSH, которая позволяет размещать псевдотерминалы. Для команды sudo требуется интерактивный терминал, поэтому эта опция необходима.
Выполнить скрипт
Удаленное выполнение не ограничивается только командами; мы даже можем выполнить скрипт через SSH. Нам просто нужно указать абсолютный путь локального скрипта к команде SSH.
Давайте создадим простой сценарий оболочки со следующим содержимым и назовем его system-info.sh
#!/bin/sh uname hostname
Сделайте скрипт исполняемым и запустите его на удаленном сервере следующим образом:
$ chmod +x system-info.sh
$ ssh infoit@192.168.10.10 ./system-info.sh
Как некоторые из вас, возможно, догадались, он выдаст следующий результат:
Linux linux-server
Проблема с переменным расширением
Если мы разделим команды на несколько строк, то расширение переменных работать не будет. Давайте посмотрим на простой пример:
$ msg="Hello Infoit" $ ssh infoit@192.168.10.10 'echo $msg'
Когда мы выполняем указанную выше команду, мы видим, что переменная не расширяется.
Чтобы решить эту проблему, нам нужно использовать параметр -c оболочки. В нашем случае мы будем использовать его с bash следующим образом:
$ ssh infoit@192.168.10.10 bash -c "'echo $msg'"
Настроить сеанс SSH без пароля
По умолчанию SSH каждый раз запрашивает аутентификацию по паролю. Это принудительно по соображениям безопасности. Однако иногда это раздражает. Чтобы преодолеть это, мы можем использовать механизм аутентификации с открытым и закрытым ключом.
Его можно настроить, выполнив следующие действия:
1) Создайте пару открытого и закрытого ключей
SSH предоставляет утилиту ssh-keygen, которую можно использовать для генерации пар ключей на локальном компьютере.
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/infoit/.ssh/id_rsa): #press enter Enter passphrase (empty for no passphrase): #press enter Enter same passphrase again: #press enter Your identification has been saved in /home/infoit/.ssh/id_rsa. Your public key has been saved in /home/infoit/.ssh/id_rsa.pub.
Приведенные выше выходные данные показывают, что сгенерированные пары ключей хранятся в каталоге ~ / .ssh.
2) Добавьте открытый ключ в файл ~ /.ssh/authorized_keys на удаленном хосте
Простой способ сделать это — использовать команду ssh-copy-id.
$ ssh-copy-id -i ~/.ssh/id_rsa.pub infoit@192.168.10.10
В приведенной выше команде:
- -i опция указывает файл идентификации
- ~/.ssh/id_rsa.pub файл идентификации
- оставшийся текст — это удаленный пользователь и IP-адрес удаленного сервера
ПРИМЕЧАНИЕ: Никогда не сообщайте свой закрытый ключ никому.
3) Вот и все. Не правда ли, все просто? Теперь мы можем выполнять команду по SSH без ввода пароля. Давайте проверим это.
$ ssh infoit@192.168.10.10 uname
Ограничение аутентификации публично-приватным ключом
Хотя аутентификация с использованием открытого и закрытого ключей упрощает нашу жизнь, она не идеальна. Его главный недостаток: мы не можем автоматизировать это, потому что взаимодействие с пользователем требуется в первый раз. Помнить !!! мы предоставили пароль для команды ssh-copy-id.
Не нужно впадать в панику, это не конец света. В следующем разделе мы обсудим подход, который устраняет это ограничение.
sshpass utility
Чтобы преодолеть вышеуказанное ограничение, мы можем использовать утилиту sshpass. Он обеспечивает неинтерактивный способ аутентификации сеанса SSH. В этом разделе обсуждаются различные способы этого.
Установка sshpass
Утилита sshpass является частью официального репозитория Ubuntu. Мы можем установить его, используя следующие команды:
$ sudo apt-get update $ sudo apt-get install sshpass
Примеры
sshpass может принимать пароль — в качестве аргумента, читать его из файла или через переменную окружения. Обсудим все эти подходы.
1) Пароль как аргумент
Мы можем указать пароль в качестве аргумента с помощью опции –p:
$ sshpass -p 'secrete-password' ssh infoit@192.168.10.10 uname
2) Пароль из файла
sshpass может читать пароль из обычного файла с помощью опции -f:
$ echo "secrete-password" > password-file
$ sshpass -f password-file ssh infoit@192.168.10.10 uname
3) Пароль из переменной окружения
В дополнение к этому мы можем предоставить пароль из переменной окружения, используя параметр -e:
$ export SSHPASS="secrete-password"
$ sshpass -e ssh infoit@192.168.10.10 uname
Заключение
В этом руководстве показаны различные приемы и советы по удаленному выполнению команд через SSH. Как только вы поймете эти приемы, это значительно упростит вашу жизнь и определенно повысит вашу продуктивность.