我需要在远程服务器上运行 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。版权所有。'
我需要帮助来理解如何解决此错误,其次如何运行此脚本在多个服务器上而不是仅在 1 个服务器上执行 ssh ?谢谢!
答案1
将定界符标记从 更改EOF
为单引号字符串'EOF'
。这将阻止本地 shell 评估$( ... )
命令和$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
您的 shell 替换 *,在本地运行命令...试试这个:
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