我想创建一个 shell 脚本,它将登录到服务器,从服务器获取磁盘使用情况,通过电子邮件发送给我,然后退出服务器。此外,如果可能的话,每天都执行一次。这是我的:
#!/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
该 shell 脚本的名称是 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 运行脚本.sh
- 对于你的任意、一时兴起的请求,你可以 ssh 并执行脚本
脚本
这是您放在服务器上的脚本,例如 /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: ...
,以便您至少可以立即获得脚本是否运行的反馈。