Выполнение команд в удаленных системах Linux через SSH
Вызов команд или программ на удаленных машинах через защищенное сетевое соединение
На днях я тестировал, как сохранить права доступа к файлам при копировании файлов или каталогов в несколько мест и систем. Когда я хотел проверить права доступа к файлам в удаленной системе, мне пришлось войти в эту систему через SSH и проверить атрибуты. Меня немного раздражал процесс многократного входа и выхода из удаленной системы. Я подумал, что было бы лучше, если бы я мог выполнять команды в удаленных системах Linux через SSH.
К счастью, я нашел обходной путь для вызова команд и программ на удаленном компьютере через безопасное сетевое соединение, просматривая справочные страницы команды ssh
.
Если вы когда-нибудь задавались вопросом, как запустить команду или сценарий в удаленной системе из самой локальной системы, не входя в эту удаленную систему, вот как это сделать.
1. Выполнение команд в удаленных системах Linux через SSH.
Типичный способ запуска команды или сценария в удаленной системе через SSH из локальной системы:
ssh <username@IP_Address-or-Doman_name> <Command-or-Script>
Позвольте мне показать вам несколько примеров.
1.1. Запустите одну команду в удаленных системах через SSH
Допустим, вы хотите найти сведения о ядре вашей удаленной системы Linux. Для этого просто запустите:
ssh sk@192.168.225.22 uname -a
Здесь,
sk
— это имя пользователя моей удаленной системы,192.168.225.22
— IP-адрес удаленной системы,- И
"uname -a"
— это команда, которую я хочу запустить в удаленной системе из моей локальной системы.
Пример вывода:
Выполнение команд в удаленных системах Linux через SSH
Видеть? На самом деле я не входил в удаленную систему, но выполнил команду uname
в удаленной системе через SSH и отобразил вывод в терминале моей локальной системы.
Вы также можете указать команду в кавычках, как показано ниже.
ssh sk@192.168.225.22 "uname -a"
Или,
ssh sk@192.168.225.22 'uname -a'
Если вы изменили порт по умолчанию протокола SSH, просто укажите это, используя параметр -p
, как показано ниже.
ssh -p 2200 sk@192.168.225.22 uname -a
1.2. Выполнение нескольких команд на удаленных хостах через SSH
Вы также можете запустить несколько команд на удаленном хосте, указав их в кавычках, как показано ниже.
ssh sk@192.168.225.22 "uname -r && lsb_release -a"
Или,
ssh sk@192.168.225.22 "uname -r ; lsb_release -a"
Приведенные выше команды отобразят версию ядра и сведения о распространении моего сервера Ubuntu.
Пример вывода:
Запуск нескольких команд на удаленных хостах через SSH в Linux
Как заметил один из наших читателей в разделе комментариев ниже, вам следует указать несколько команд в кавычках. Если вы не используете кавычки, первая команда будет выполнена на удаленной системе, а вторая команда будет оценена только на локальном компьютере. Вся команда в кавычках будет обработана удаленно, как и предполагалось.
Внимание! Знайте разницу между “&& ”
и “; Операторы ”
между командами:
Оператор “&& ”
выполняет вторую команду только в том случае, если первая команда прошла успешно.
Пример :
sudo apt-get update && sudo apt-get upgrade
В приведенном выше случае вторая команда (sudo apt-get update
) будет выполнена, если первая команда прошла успешно. В противном случае он не запустится.
»; Оператор ”
выполняет вторую команду, даже если первая команда была успешной или неудачной.
Пример :
sudo apt-get update ; sudo apt-get upgrade
В приведенном выше случае вторая команда (sudo apt-get update
) будет выполнена, даже если первая команда завершилась неудачно.
1.3. Вызов команд с привилегиями Sudo на удаленных машинах через SSH
Для запуска некоторых команд требуются права "sudo"
. Например, следующая команда установит Vim в моей удаленной системе.
ssh -t sk@192.168.225.22 sudo apt install apache2
Пример вывода:
Запускайте команды с привилегиями Sudo на удаленных машинах через SSH
Ты заметил? Я использовал флаг -t
в приведенной выше команде. Нам нужно упомянуть этот флаг -t
, чтобы принудительно выделить псевдотерминал. Это можно использовать для выполнения произвольных экранных программ на удаленном компьютере, что может быть очень полезно, например. при реализации сервисов меню.
Кроме того, я ввел пароль дважды. В первый раз я ввел пароль удаленного пользователя для доступа к удаленной системе через SSH из моей локальной системы, а второй пароль необходим, чтобы дать удаленному пользователю разрешение sudo на установку приложения (т. е. в данном случае apache2) в удаленной системе. .
Давайте проверим, запущен ли сервис Apache, с помощью команды:
$ ssh -t sk@192.168.225.22 sudo systemctl status apache2
sk@192.168.225.22's password:
[sudo] password for sk:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2019-12-19 11:08:03 UTC; 52s ago
Main PID: 5251 (apache2)
Tasks: 55 (limit: 2318)
CGroup: /system.slice/apache2.service
├─5251 /usr/sbin/apache2 -k start
├─5253 /usr/sbin/apache2 -k start
└─5254 /usr/sbin/apache2 -k start
Dec 19 11:08:03 ubuntuserver systemd[1]: Starting The Apache HTTP Server...
Dec 19 11:08:03 ubuntuserver apachectl[5227]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2409:4072:51f:a1b6:a00:27ff:f
Dec 19 11:08:03 ubuntuserver systemd[1]: Started The Apache HTTP Server.
Точно так же мы можем запустить любую команду или сценарий в удаленной системе через SSH из локальной системы.
1.4. Запуск локальных сценариев на удаленных системах через SSH
Давайте создадим простой скрипт в нашей локальной системе для отображения всей доступной информации об имени дистрибутива вашей удаленной системы, управлении пакетами, базовых деталях и т. д.
vi system_information.sh
Добавьте следующие строки:
#!/bin/bash
#Name: Display System Details
#Owner: OSTechNIx
#----------------------------
echo /etc/*_ver* /etc/*-rel*; cat /etc/*_ver* /etc/*-rel*
Нажмите клавишу ESC
и введите :wq
, чтобы сохранить файл и выйти.
Теперь запустите этот скрипт в своей удаленной системе через SSH, используя команду:
ssh sk@192.168.225.22 'bash -s' < system_information.sh
Пример вывода:
sk@192.168.225.22's password:
/etc/debian_version /etc/lsb-release /etc/os-release
buster/sid
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Если вы не укажете 'bash -s'
в приведенной выше команде, вы получите подробную информацию об удаленной системе, но псевдотерминал не будет выделен.
1,5. Сохранить вывод команды с удаленного хоста на локальный хост
Это может быть полезно, если вы хотите поделиться выводом команды, которую вы запускаете в удаленной системе через SSH, со своей командой поддержки или коллегой.
Следующая команда запустит "du -ah"
в вашей удаленной системе через SSH и сохранит вывод в diskusage.txt
в вашей локальной системе.
ssh sk@192.168.225.22 du -ah > diskusage.txt
Затем вы можете проанализировать детали использования диска, просмотрев файл diskusage.txt
с помощью команды cat
или средств просмотра текста.
$ cat diskusage.txt
4.0K ./.profile
4.0K ./.gnupg/private-keys-v1.d
8.0K ./.gnupg
76K ./data/image.jpg
128K ./data/file.pdf
20K ./data/text.docx
5.9M ./data/audio.mp3
6.1M ./data
0 ./.sudo_as_admin_successful
4.0K ./pacman?inline=false
4.0K ./.bash_logout
4.0K ./.wget-hsts
4.0K ./.bash_history
0 ./.cache/motd.legal-displayed
4.0K ./.cache
4.0K ./deb-pacman_1.0-0.deb
4.0K ./.bashrc
6.2M .
1.6. Настройте аутентификацию на основе ключей SSH, чтобы избежать ввода пароля
Если вы часто запускаете команды в удаленных системах, возможно, вам захочется настроить аутентификацию на основе ключей SSH, чтобы каждый раз пропускать ввод пароля. Более подробную информацию можно найти по следующей ссылке.
- Как настроить аутентификацию на основе ключей SSH в Linux
После настройки аутентификации на основе ключей SSH мы можем выполнять команды на удаленных машинах через SSH без ввода пароля:
ssh sk@192.168.225.22 sudo apt update
2. Используйте sshpass при выполнении команд на удаленных машинах через SSH
Если вы не хотите настраивать аутентификацию на основе ключей SSH, вы можете использовать утилиту sshpass для запуска команд на удаленных компьютерах без ввода пароля.
2.1. Что такое sshpass?
Утилита sshpass предназначена для запуска ssh в режиме аутентификации по паролю с помощью клавиатуры, но неинтерактивным способом. Проще говоря, sshpass предлагает неинтерактивный способ аутентификации сеанса SSH.
SSH использует прямой доступ TTY, чтобы убедиться, что пароль действительно выдан пользователем интерактивной клавиатуры. Sshpass запускает ssh в выделенном терминале, обманывая его, заставляя думать, что он получает пароль от интерактивного пользователя.
2.2. Установить sshpass в Linux
Утилита sshpass доступна в репозиториях по умолчанию многих дистрибутивов Linux. Например, вы можете использовать следующую команду для установки sshpass в Debian, Ubuntu и их производных:
sudo apt install sshpass
2.3. Выполнение команд на удаленных машинах через SSH с помощью sshpass
sshpass может принимать пароль в качестве аргумента, читать пароль через переменную среды или читать пароль из текстового файла.
Предупреждение:< Все эти методы крайне небезопасны. Все пользователи системы могут увидеть пароль в командах, просто введя команду ps
. НЕ РЕКОМЕНДУЕТСЯ использовать эти методы в производстве. Вместо этого лучше использовать аутентификацию на основе ключей.
Давайте посмотрим примеры для каждого метода.
Укажите пароль в качестве аргумента:
Чтобы указать пароль в качестве аргумента, используйте опцию -p
, как показано ниже.
sshpass -p <remote-password> ssh remoteuser@ip-address <command-to-execute>
Пример:
sshpass -p ubuntu ssh ostechnix@192.168.1.30 uname -a
Здесь,
-p ubuntu
— предоставляет пароль для удаленной системы.ostechnix@192.168.1.30
— имя и IP-адрес удаленного пользователя.- '
uname -a
' — команда для выполнения на удаленном компьютере.
Пример вывода:
Linux Ubuntu22CT 5.15.60-1-pve #1 SMP PVE 5.15.60-1 (Mon, 19 Sep 2022 17:53:17 +0200) x86_64 x86_64 x86_64 GNU/Linux
Укажите пароль в качестве переменной среды:
В этом методе мы объявляем переменную среды с именем SSHPASS, в качестве значения которой используется пароль удаленной системы. Затем мы предоставляем пароль с флагом -e
, как показано ниже:
SSHPASS=ubuntu sshpass -e ssh ostechnix@192.168.1.30 uname -a
Читать пароль из текстового файла:
Добавьте пароль в текстовый файл с помощью команды echo:
echo "ubuntu" > mypassword.txt
Теперь передайте файл паролей в sshpass l с флагом -f
, как показано ниже:
sshpass -f mypassword.txt ssh ostechnix@192.168.1.30 uname -a
Выполнение команд на удаленных машинах через SSH с помощью sshpass
Заключение
В этом уроке мы изучили несколько способов вызова команды или программы на удаленном компьютере через безопасное сетевое соединение. Среди всех методов метод sshpass наименее безопасен. Пользователям рекомендуется избегать использования sshpass в производственных системах.
Рекомендуем прочитать:
- Как возобновить частично переданные файлы по SSH с помощью Rsync
- Как запустить одну команду на нескольких удаленных системах одновременно
- DSH – запуск команды Linux на нескольких хостах одновременно
- Как создать псевдоним SSH в Linux
- SSLH – используйте один и тот же порт для HTTPS и SSH
- ScanSSH — быстрый SSH-сервер и открытый прокси-сканер
- Как подключиться по SSH к определенному каталогу в Linux
- Разрешить или запретить доступ по SSH определенному пользователю или группе в Linux
- Как предотвратить разрыв сеанса SSH в Linux
- Как включить SSH во FreeBSD
- Советы по Vim: редактируйте удаленные файлы с помощью Vim в Linux