通过 ssh 从另一台服务器获取此命令的输出

通过 ssh 从另一台服务器获取此命令的输出

我正在尝试 ssh 进入服务器并使用特定命令获取系统正常运行时间,但它无法执行。

这几乎可以在所有 UNIX 系统上本地运行

startuptime=`uptime | awk '{print $2,$3,$4,$5}'` && startuptime1=${startuptime%,} && startdayshours=${startuptime1%%:*}' Hours, ' && startminutes=${startuptime1##*:}' Minutes' && echo 'System Uptime -' $startdayshours$startminutes `date`

但如果我这样做,它将不起作用(无论我如何更改/添加转义字符或 $() 或 `` 或 ' " ' " ' 引号等..)

ssh user@server "startuptime=`uptime | awk '{print $2,$3,$4,$5}'`; startuptime1=${startuptime%,}; startdayshours=${startuptime1%%:*}' Hours, '; startminutes=${startuptime1##*:}' Minutes'; echo 'System Uptime -' $startdayshours$startminutes `date`"

PS:我知道它不适用于引号,因为我需要转义内部引号,但这只是一个例子ssh user@server command_goes_here

答案1

你的命令中有反引号。这意味着它们在 ssh 命令之前运行。另外,您正在 ssh 命令中进行分配。不过,您对该任务没有做任何事情。因此,ssh 可能会将垃圾分配给您从未使用过的启动时间变量。

您真正想要的只是远程服务器上 uptime 命令的输出。然后你可以通过本地 awk 和其他东西通过管道来获得你想要的东西。

ssh user@server uptime | awk '{print $2, $3, $4, $5}'

如果这对您有用,您可以添加其余命令。

你甚至可以这样做

startuptime=$(ssh user@server uptime)
echo startuptime | awk '{print $2, $3, $4, $5}'

如果您想在本地进一步处理该删除值。

答案2

您只需将该命令放入 bash 文件中,然后按如下所示运行:

  • ssh user@server < script.sh

答案3

我同意您应该从服务器获取正常运行时间并在本地处理结果的建议。

然而,此类任务的一般解决方案是您必须引用本地 shell 解释的所有内容。这包括引号本身、美元符号和反引号(无论如何都已弃用)。

答案4

参考刘易斯的回答,它是这样工作的

script.sh 与 chmod +x

#!/bin/bash
running=$(ps aux | grep -v grep | grep "`basename "$0"`" | wc -l);
[[ $running > 2 ]] && exit;

declare -a servers=(
            "server1"
            "server2"
            "server3"
        )

for i in "${servers[@]}"
    do
    log_path="/path/to/log/folder/$i"
    if [ ! -f "$log_path" ]; then
        touch "$log_path"
    fi
    ssh_output=$(ssh user@$i uptime | awk '{print $2,$3,$4,$5}')
    startuptime=${ssh_output%,}
    startdayshours=${startuptime%%:*}' Hours, '
    startminutes=${startuptime##*:}' Minutes'
    echo 'System Uptime -' $startdayshours$startminutes `date` >> "$log_path"
done

并使用 cron 我执行了以下操作:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /path/to/script/script.sh

相关内容