繁体   English   中英

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

[英]How to run shell script located on Linux server from Windows environment?

我正在尝试从Windows运行Linux服务器上的Shell脚本。 Shell脚本有两件事:

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

Shell脚本:

!/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到shell脚本的目录。
  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 (路径,变量等)有不正确的假设?

Cygwin是唯一的出路吗?

我一直在尝试不依赖其他工具,因为我一直在使用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文件,而该文件没有运行所需的组件(即,设置环境变量,路径等)

这不是解决方案,而是部分解决了一些问题,这要感谢Martin Prikryl和Mofi的投入:

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

ORACLE_SID
ORACLE_HOME
路径

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

sqlplus $ arg2 / $ arg2 @ MYDB

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

@ sequence。$ arg1.sql

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM