루프가 제대로 작동하지 않는 경우 원격 서버 스크립트 및 명령을 호출할 때 권한이 거부됩니다.

루프가 제대로 작동하지 않는 경우 원격 서버 스크립트 및 명령을 호출할 때 권한이 거부됩니다.

우리는 두 개의 서버를 가지고 있는데 하나는 aix이고 다른 하나는 Linux이므로 우리 Linux 서버에서 스크립트 실행 시간을 최소화하기 위해 aix에 있는 스크립트를 호출하려고 합니다. 코드: 리눅스 머신에서

ssh user@$ip "sudo -u user2 'bash -c .  /path (loading user profile) ; sh script.sh' "

Aix 머신에서:

스크립트 파일

#/bin/bash
. /path [loading user profile]

db2 connect to db_name

db2 list tablespaces | grep -i state | wc -l  > state_log

db2 list tablespaces | grep -i state | wc -l  > normal_log



var1=$(cat state_log)

var2=$(cat normal_log)

if [[ "${var1}" == "${var2}" ]]
then
echo " tablespaces are normal "
else
echo "tablespaces are not normal"
fi

스크립트는 aix 시스템에서는 제대로 실행되지만 Linux 시스템에서는 오류가 발생합니다.

cat: cannot open state log and normal log : permission denied( even after giving
Full permission to file)

----++++새로운 변경 사항++++++

댓글 섹션에 있는 귀하의 제안을 바탕으로 몇 가지 사항을 변경했습니다.

이제 Linux 시스템에서는 다음 코드를 사용하여 원격 서버의 스크립트를 호출합니다.

ssh user@$ip 'sudo -u user2 bash script.sh' 

Aix 머신에서:

script.sh:

#/bin/bash 
. /path [user profile]
 if [[ `db2 connect to db_name |  db2 list tablespaces | grep -i state | wc -l` == `db2 connect to db_name` | db2 list tablespaces | grep -i state | wc -l` ]]
then 
echo " tablespaces are normal " 
else 
echo "tablespaces are not normal" 
fi 

스크립트는 이제 aix 시스템에서 제대로 작동하지 않습니다. 때로는 if 루프에서 첫 번째 명령의 값을 가져오고 때로는 두 번째 명령의 값을 가져옵니다. 코드에 어떤 문제가 있는지 이해가 되지 않습니다. 모든 도움에 미리 감사드립니다!

+++++++새로운 변경 사항 2 +++++++

나는 aix 스크립트를 다음과 같이 변경했고 그것은 나에게 효과적이었습니다.

#/bin/bash ./path [사용자 구성 파일 로드]

db2는 db_name에 연결합니다.

db2 목록 테이블 공간 | grep -i status | wc -l > 파일 1의 전체 경로

db2 목록 테이블 공간 | grep -i status | wc -l > 파일 2의 전체 경로

var1=$(cat full_path_of_file1)

var2=$(cat file2의 전체 경로)

if [[ "${var1}" == "${var2}" ]] then echo "테이블 공간이 정상입니다." else echo "테이블 공간이 비정상입니다." fi

AIX 운영 체제는 약간 이상하게 동작하지만 작동합니다.

답변1

바꾸다

ssh user@$ip "sudo -u user2 'bash -c .  /path (loading user profile) ; sh script.sh' "

그리고

ssh user@$ip sudo -u user2 bash script.sh

./path스크립트가 가장 먼저 하는 일은 자신을 호출하는 것이므로 스크립트 외부에서 호출할 필요가 없습니다 . 이 시점에서 선은 크게 단순화될 수 있습니다.

그래도 권한 오류가 해결되지 않으면 스크립트의 올바른 디렉터리에 있는지 확인하세요.

ssh user@$ip sudo -Hu user2 bash script.sh

더 나은 방어 코딩은 스크립트의 파일에 대한 디렉터리 경로를 사용하고 state_log해당 normal_log파일에 쓰기 위해 필요한 디렉터리를 명시적으로 설정하는 것입니다.

전체 스크립트를 표시하는 경우 db2파일에 쓰지 않고 출력을 두 변수에 직접 캡처하여 추가로 최적화할 수도 있습니다.

#/bin/bash
. /path    # Load user profile

db2 connect to db_name
var1=$(db2 list tablespaces | grep -i state | wc -l)
var2=$(db2 list tablespaces | grep -i state | wc -l)

if [[ $var1 -eq $var2 ]]
then
    echo "tablespaces are normal"
else
    echo "tablespaces are not normal"
fi

$var이유를 완전히 확신할 수 는 없지만 $var2이 경우에는 다를 것입니다.

관련 정보