ループが正しく機能しない場合、リモートサーバースクリプトとコマンドを呼び出すときに権限が拒否されます。

ループが正しく機能しない場合、リモートサーバースクリプトとコマンドを呼び出すときに権限が拒否されます。

私たちは2つのサーバーを持っています。一方はaixで、もう1つはLinuxなので、私たちのLinuxサーバーでスクリプトの実行時間を最小限に抑えるためにaixのスクリプトを呼び出そうとします。コード:Linuxマシンで

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番目のコマンドの値を取得します。コードに何が問題なのかわかりません。すべての助けに事前に感謝!

+++++++ 新しい変更 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ファイルに書き込まずに出力を2つの変数に直接キャプチャしてさらに最適化することもできます。

#/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この場合は異なります。

関連情報