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

サーバーから稼働時間を取得し、結果をローカルで処理する必要があるという提案に同意します。

ただし、これらの操作に対する一般的な解決策は、ローカルシェルで解釈されたすべての内容を引用する必要があることです。これには、引用符自体、ドル記号、バックティック(とにかく廃止)が含まれます。

答え4

Lewisの答えを参照すると、次のように動作します。

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

関連情報