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`"

추신: 내부 따옴표를 이스케이프 처리해야 하기 때문에 따옴표와 함께 작동하지 않는다는 것을 알고 있지만 이는 단지 예일 뿐입니다.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

관련 정보