
リモートサーバーで3つのコマンドを実行する必要があります。
これら2つのコマンドは単純なバージョンチェックで、3番目のコマンドはデフォルトでデータベースのバージョンをチェックするショートプログラムです。内容はこれです
#!/bin/sh
ssh -t user@server << EOF
#AIP_version
domaininfo -d $GLOBAL_DOMAIN -history | head -n -3 | tail -1 > /home/abc/aip_version.txt
## Fetching AIP Online Details ##
variable1=$(
echo "set feed off
set pages 0
select * from system_parameters where name like '%VERS%';
exit
" | sqlplus /@aipprealias01
)
echo "$variable1" > aipo_version.txt
#Fetching RPAS-AIP Details
domaininfo -d $GLOBAL_DOMAIN -version | sed -n '4,7p' > /home/abc/rpas-aip_version.txt
EOF
このスクリプトを実行しようとすると、次のエラーが発生します。
stdin が端末ではないため、疑似端末は割り当てられません。
-bash: 行 8: SQL*Plus:: コマンドが見つかりません
-bash:行10:予期しないトークン 'c'の近くに構文エラーがあります。
-bash:10行目: `著作権(c)1982、2014、Oracle。すべての権利を保有。 '
このエラーを解決する方法を理解するのに役立つ必要があり、2番目に1台ではなく複数のサーバーでSSH用にこのスクリプトを実行するにはどうすればよいですか?ありがとうございます!
答え1
EOF
一重引用符で囲まれた文字列で区切り文字タグを変更します'EOF'
。これにより、ローカルシェルが$( ... )
コマンドと$variable
変数を評価できなくなります。
たとえば、EOF
これをマークアップの周囲の一重引用符(表示されているように)と比較し、マークアップなしで比較します。
nl << 'EOF'
Numbered line
And another $(date)
EOF
一重引用符で出力
1 Numbered line
2 And another $(date)
引用符なしで出力
1 Numbered line
2 And another 29 Dec 2021 16:20:40
答え2
* をシェルに置き換え、ローカルでコマンドを実行します。以下を試してください。
cat <your_script_body.txt>|ssh user@server "$(cat)"
your_script_body.txt:
#AIP_version
domaininfo -d $GLOBAL_DOMAIN -history | head -n -3 | tail -1 > /home/abc/aip_version.txt
## Fetching AIP Online Details ##
variable1=$(
echo "set feed off
set pages 0
select * from system_parameters where name like '%VERS%';
exit
" | sqlplus /@aipprealias01
)
echo "$variable1" > aipo_version.txt
#Fetching RPAS-AIP Details
domaininfo -d $GLOBAL_DOMAIN -version | sed -n '4,7p' > /home/abc/rpas-aip_version.txt