【问题标题】:Run script on remote server from local machine从本地计算机在远程服务器上运行脚本
【发布时间】:2018-02-05 01:30:18
【问题描述】:

我在机器 (B) 上有一个远程脚本,当我从机器 (B) 运行它时,它可以完美运行。我想通过机器 (A) 上的 ssh 运行脚本:

ssh usersm@${RHOST} './product/2018/requests/inbound/delDup.sh'

但是,机器(A)抱怨远程脚本的内容(2018req*.txt是脚本开头定义的变量):

ls: cannot access 2018req*.txt: No such file or directory

【问题讨论】:

  • 你能显示你的脚本的开头吗?您确定这些文件存在于您的远程计算机 (B) 上吗?
  • globbing 不能通过 SSH 很好地传输。我建议您使用find 找到同义的方式来做您需要做的事情。

标签: bash shell ssh remote-server


【解决方案1】:

从所提供的信息来看,除了猜测之外很难做更多的事情。所以这里有一个猜测:当你直接在机器 B 上运行脚本时,你是从你的主目录使用 ./product/2018/requests/inbound/delDup.sh 运行它,还是你 cd 进入 product/2018/requests/inbound 目录并使用 @987654326 运行它@?如果是这样,使用2018req*.txt 会在不同的地方查找;基本上,它会在您运行脚本时所在的目录中查找。如果您在本地 cded 到入站目录,它会在那里查找,但远程运行它不会更改到该目录,因此 2018req*.txt 将在主目录中查找文件。

如果这是问题所在,我会将脚本重写为 cd 到适当的目录,方法是直接在脚本中硬编码绝对路径,或者检测脚本所在的目录(参见 "https://stackoverflow.com/questions/59895/getting-the-source-directory-of-a-bash-script-from-within"BashFAQ #28: "How do I determine the location of my script? I want to read some config files from the same place")。

顺便说一句,当你在脚本中使用cd 时,你应该测试cd 命令的退出状态以确保它成功,因为如果没有成功,脚本的其余部分将在错误的地方执行并且可能会做出意想不到和不愉快的事情。如果失败,您可以使用|| 运行错误处理程序,如下所示:

cd somedir || {
    echo "Cannot cd to somedir" >&2
    exit 1
}

如果这不是问题,请提供有关脚本及其运行情况的更多信息(即文件位置)。最好的办法是 create a Minimal, Complete, and Verifiable example 显示问题。基本上,制作脚本的副本,删除与问题无关的所有内容,确保它仍然存在问题(否则您删除了 相关的内容),然后添加(和文件地点)到问题。

【讨论】:

    【解决方案2】:

    首先,当您使用 SSH 时,远程机器/ssh 服务器不会直接将输出(stdoutstderr)发送到监视器,而是将数据发送回您启动ssh 连接。在你的本地机器上运行的ssh 客户端只会显示它(当然除非你重定向它)。

    现在,根据您提供的信息,文件似乎不在服务器 (B) 上或无法访问(最后但并非最不重要的是,您确定您的 ls 目标是正确的目录吗?)您可以显示在运行 ls 命令之前,脚本中的当前目录进行调试。

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 2013-12-28
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多