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

标签 linux cmd plink

我正在尝试从 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就可以正常工作了。但是,通过 plink 从 .cmd 向 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

关于linux - 如何从 Windows 环境运行位于 Linux 服务器上的 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57188347/

相关文章:

linux - rsync 详细的最终统计数据但没有文件列表

ruby-on-rails - "random: nonblocking pool"在 Ubuntu 16.04 服务器上初始化需要很长时间

python - 从详细信息选项卡中获取文件描述

python - 如何将 Python 程序的标准输出移至文件?

postgresql - 如果 ENTRYPOINT 未完成,Dockerfile 不会运行 CMD

powershell - 在 PowerShell 中回答 Plink 主机 key 和 KEX 提示

maven - mvn exec :exec with '<' in commandlineArgs

linux - 寻找在服务器机器启动时启动新 tmux 部分的方法

linux - 为什么/tmp 有权在 linux 中只读/写自己的文件/目录

bash - 通过 Plink 在 Windows 命令行上运行 shell 脚本(带参数)