Как выполнять команды Linux в удаленной системе через SSH

Как выполнять команды 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. Как только вы поймете эти приемы, это значительно упростит вашу жизнь и определенно повысит вашу продуктивность.