我有一个备份远程系统的脚本,并希望它在运行备份脚本之前和之后显示远程备份设备上的磁盘空间。
感谢另一篇文章,我学会了如何通过 SSH 运行远程命令,例如(已设置 SSH 密钥以自动登录)。
echo `ssh -t user@host uname -a`
但是,我怎样才能获得来自如下命令的多行响应
echo `ssh -t user@host df`
响应仅显示 df 输出的最后一行
答案1
这听起来有点太复杂了,需要通过 SSH 连接到某个地方并调用命令。
只需输入:
ssh user@host df
瞧。:)
编辑1
远程输出解析示例:
ssh user@host df -P | tail -n +2 | awk '{print $6 "," $4}'
输出逗号分隔的列表挂载点,可用空间喜欢:
/,1393276
/usr,3524132
/var,2560004
答案2
这可能不是最有效或最优雅的方式,但是不妨这样:
REMOTEDF="ssh 用户名@主机名 df"
echo "从主机名预备份 df"
echodate
>> $HOME/df-backups.out
echo "" >> $HOME/df-backups.out
$REMOTEDF >> $HOME/df-backups.out
echo "" >> $HOME/df-backups.out
--执行备份--
echo "主机名备份已完成;备份后 df:"
echodate
>>
$HOME/df-backups.out
echo "" >> $HOME/df-backups.out
$REMOTEDF >> $HOME/df-backups.out
echo "" >> $HOME/df-backups.out
答案3
此处 echo 是问题的根源。删除 echo 即可获得多行输出。为什么不直接使用ssh username@hostname cmd
Why -t 呢?
答案4
这是我的黑客解决方案。此代码并不完美,我相信还有其他比这更优雅、更高效的方法。但我还是想说说。
我将创建一个cmds.txt
包含输入命令的文件以在远程服务器上运行,远程服务器的输出将保存在另一个文件中out.txt
。
通过将输入命令分离到单独的文件中,修改代码将变得更加容易。
此外,将输出保存到文本文件,将通过保留换行符来保留输出;当我们需要从远程服务器获取多行输出时很有用。
cmds.txt 的内容
此处放置的代码将在远程服务器中执行
df
script.sh 的内容
这在本地机器上运行
#!/bin/bash
cmd=$(cat cmds.txt)
/usr/bin/ssh -o StrictHostKeyChecking=no ssh -i $KEY $USERNAME@$HOST "$cmd" > out.txt
cat out.txt