[英]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服务器上。)
userID
连接到服务器。 my_env
。 cd
到shell脚本的目录。 ./myscript.sh
运行脚本。 test.cmd
。 在.cmd文件中,我这一行:
plink.exe -ssh userID@Server
控制台窗口弹出后,我重复步骤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.