如何从Windows环境运行位于Linux服务器上的shell脚本?



我正在尝试从Windows运行位于Linux服务器上的shell脚本。 shell 脚本执行两件事:

  • 执行sed命令以替换同一目录中.sql文件中的文本。
  • 使用sqlplus运行.sql文件。

外壳脚本:

!/bin/sh
arg1=$1
arg2=$2
arg3=$(echo $arg1 | tr '[:lower:]' '[:upper:]')
arg4=$(echo $arg2 | tr '[:lower:]' '[:upper:]')
echo $arg1
echo $arg2
echo $arg3
echo $arg4   
sed -i "s/$arg3/$arg4/g" sequence.$arg1.sql
sqlplus $arg2/$arg2@MYDB <<EOF
@sequence.$arg1.sql
exit;

(我的数据库位于同一个 Linux 服务器上。

1) 当我通过 MobaXterm 登录到服务器时脚本正常运行

  1. 使用userID连接到服务器。
  2. 设置my_env.
  3. cd到外壳脚本的目录。
  4. 使用./myscript.sh参数运行脚本。

2) 相同的 shell 脚本通过 .cmd 手动成功运行

  1. 在我的 Windows PC 上创建一个 Windows 脚本test.cmd
  2. 在 .cmd 文件中,我有一行:

    plink.exe -ssh userID@Server
    
  3. 弹出控制台窗口后,我重复步骤 2 到 4,脚本成功运行。

我未能做到这一点的是使整个过程自动化。

这是我尝试的.cmd文件中的行:

plink.exe -ssh userID@Server /myfilepath/myscript.sh %arg1% %arg2%

我可以看到在 shell 脚本中使用多个echo正确传递的参数。但是,shell 脚本无法找到.sql文件。

错误日志:

/mypath/myscript.sh[1]: !/bin/sh^M not found [No such file or directory]
myarg1value
myarg2value
:No such file or directory[myarg1value]
/mypath/myscript.sh[12]: sqlplus: not found [No such file or directory]

我也在下面尝试过,但不幸的是结果相同:

plink.exe -ssh userID@Server -m command.txt

其中文件command.txt包含:

. my_env
cd /filepath/
./myscript.sh %arg_with_actual_value%

我不知道为什么它不起作用,尤其是当 2) 有效且脚本相对简单时。

我是否错误地假设了plink(路径、变量等)?

天鹅是唯一的出路吗?

我尽量不依赖另一个工具,因为我一直在使用plink.

编辑:虽然行

sed -i "s/$arg3/$arg4/g" sequence.$arg1.sql

无法在.sh上运行,我可以通过以下方式在 .cmd 文件本身上运行它:

plink.exe -ssh userID@Server sed -i "s/%arg3%/%arg4%/g" /myfilepath/sequence.%arg1%.sql

因此,我怀疑问题来自.sh文件没有运行所需的组件(即设置 env 变量、路径等)

这不是一个解决方案,但由于Martin Prikryl和Mofi的输入,部分修复了一些问题:

在命令.txt中,需要设置以下内容:


ORACLE_SID ORACLE_HOME
路径

设置这些后,SQLP和SED将正常工作。 但是,通过 plink 将值从 .cmd 传递到 Linux 的 shell 脚本似乎与传递的实际值有问题。 该变量将具有分配的值以及一些不可读的字符。 在这种情况下,

sqlplus $arg 2/$arg 2@MYDB

登录失败,因为 arg2 包含一些其他字符。

@sequence.$arg 1.sql

这一行也会失败,因为它将尝试打开 2 个文件,一个称为 sequence.myvalue,另一个称为"%s",我怀疑分配的变量包含某种不可读的下一行字符。

编辑:已修复,我们可以使用 sed 的相同处理方式 - 直接从 plink 运行 sqlplus,而不是在 Linux 中传递值和运行.sh脚本:

sqlplus $arg2/$arg2@MYDB @/myfilepath/sequence.%arg1%.sql

相关内容

最新更新