ssh 到远程服务器并运行一组命令

ssh 到远程服务器并运行一组命令

我需要在远程服务器上运行 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

相关内容