
Я хотел бы создать скрипт оболочки, который будет входить на сервер, получать данные об использовании диска с сервера, отправлять мне письмо по электронной почте и затем выходить с сервера. Также, если возможно, делать это ежедневно. Вот что у меня есть:
#!/usr/bin/bash
ssh -p 1111 [email protected]
CURRENT=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
mail -s 'Disk Space Alert' [email protected] << EOF
Disk usage is at: $CURRENT%
EOF
fi
Имя скрипта оболочки — example.sh. Когда я его запускаю, он постоянно запрашивает у меня пароль, и после входа в систему ничего не происходит.
решение1
Сначала сгенерируйте открытый ключ, который будет использоваться для входа в удаленную систему без пароля:
ssh-keygen -t rsa -b 4096 -C "your_username"
Это сгенерирует 4096-битный ключ RSA в вашем ~/.ssh/
каталоге с вашим именем пользователя в качестве метки. Затем добавьте этот новый ключ в ваш ssh-agent, чтобы он использовался при подключении через SSH.
ssh-agent -s
ssh-add ~/.ssh/id_rsa
Если при генерации ключа вы указали пользовательское имя, замените id_rsa
его этим именем.
Теперь скопируйте содержимое вашего открытого ключа в буфер обмена.
clip < ~/.ssh/id_rsa.pub
Затем войдите на удаленный сервер и отредактируйте файл удаленного пользователя .ssh -p YOURPORT [email protected]
authorized_keys
vim .ssh/autorized_keys
Вставьте содержимое, которое вы только что скопировали в буфер обмена. Это позволит подключаться с вашего компьютера к удаленному хосту без пароля, вместо этого используя сертификаты (обычно гораздо более безопасные, в любом случае).
Теперь вам нужно создать скрипт example-script.sh
в домашнем каталоге вашего удаленного хоста (не забудьте chmod a+x example-script.sh
затем сделать его исполняемым).
#!/usr/bin/env bash
CURRENT=$(df / | awk '/\// { print $5}' | sed 's/%//g')
mail -s 'Disk Space Alert' [email protected] << EOF
Disk usage is at: $CURRENT%
EOF
А теперь создайте скрипт в локальном домашнем каталоге, local-script.sh
чтобы впоследствии легко запустить команду (опять же, не забудьте сделать его исполняемым).
#!/usr/bin/env bash
ssh -P YOURPORT [email protected] ./example-script.sh
Этот скрипт позволяет вам запустить ./local-script.sh
из вашего домашнего каталога удаленный скрипт всего в одну строку. Затем вы можете добавить это как псевдоним к вашему .bashrc
файлу, чтобы вы могли просто запустить local-script
или любой другой псевдоним, который вам может понадобиться. Вы также можете использовать абсолютный путь ( /home/your_username/local-script.sh
), crontab
чтобы он запускался в определенное время каждый день.
решение2
Сначала объясним, почему ничего не происходит, скорее всего, из-за синтаксиса. Ваша команда ssh имеет вид: ssh server
, что означает, что вы хотите только войти в систему, а затем вручную ввести некоторые команды в интерактивном режиме. Но если вы хотите, чтобы какая-то команда запускалась автоматически после входа в систему, вам следует сделать : ssh server somecommand
, поэтому простое наличие somecommand
на следующей строке не сработает.
Если вам нужна система, которая будет отправлять по электронной почте информацию о дисковом пространстве в любое время и в то же время поддерживать запланированную отправку писем, я бы порекомендовал систему из трех частей:
- один скрипт на сервере, который получает информацию о диске и логику электронной почты, например,
/home/yourusername/script.sh
- crontab для запуска script.sh
- для ваших произвольных, спонтанных запросов вы можете подключиться по ssh и выполнить скрипт
скрипт.sh
Это скрипт, который вы размещаете на сервере, например, /home/yourusername/script.sh.
#!/bin/bash
s="Disk Space Alert: $(df / | grep / | awk '{ print $5}')"
mail -s $s [email protected]
# Feedback
echo $s
Я удалил, sed
потому что он просто удалял %
знак, но затем вы добавили его обратно позже, это кажется избыточным использованием sed, поэтому я удалил его.
Во-вторых, я сократил информацию об использовании диска, чтобы она поместилась только в теме письма. Если это не сработает, то, конечно, вы можете вернуть ее к первоначальной форме, но в любом случае сообщите всем об этом, чтобы мы могли узнать, были ли какие-либо ошибки и т. д.
кронтаб
Отредактируйте crontab на вашем сервере, например, подключитесь к нему по ssh, а затем выполните следующие команды.
$ crontab -e
Вы знаете, что формат
# m h dom mon dow command
так что для ежедневного каждый день 8 утра
0 8 * * * /home/yourusername/script.sh
Итак, если вы уже протестировали скрипт и знаете, что он работает для отправки писем, то crontab запустит скрипт и отправит письмо в 8 утра каждый день.
произвольный запрос на получение информации о диске по электронной почте
Вы просто подключаетесь по ssh, но добавляете команду скрипта в конец
ssh -p 1111 [email protected] /home/yourusername/script.sh
Здесь используется синтаксис ssh, ssh server somecommand
поэтому он входит в систему, выполняет любую команду и возвращает результаты на ваш локальный стандартный вывод.
Поскольку у него есть линия обратной связи, он не только должен отправить электронное письмо, но вы также должны увидеть сообщение, Disk Space Alert: ...
чтобы вы, по крайней мере, немедленно получили ответ о том, был ли ваш скрипт запущен или нет.