우리는 두 개의 서버를 가지고 있는데 하나는 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
이 경우에는 다를 것입니다.