【问题标题】:How to execute a local Shell Script with SSH commands on server?如何在服务器上使用 SSH 命令执行本地 Shell 脚本?
【发布时间】:2019-04-21 06:47:33
【问题描述】:

我想使用 PHP 在服务器上运行具有 SSH 命令的本地 shell 脚本。在脚本中,我使用ssh 运行类似ls -lart 的命令并将结果保存在服务器的日志文件中,然后使用scp 将远程文件复制到我的本地主机。像这样:

/// my_local_shell.sh

#!/bin/bash
host=$1
user=$2
port=$3
ssh -p $port $user@$host 'ls -lart >> /home/remote/file.log'
scp -P $port $user@$host:/home/remote/file.log /home/local/file.log

如果我使用终端 user@local_host:~$ ./my_local_shell.sh 运行脚本,一切正常。但是如果我使用shell_exec() 使用 PHP 执行脚本,如下所示:

/// index.php

$output = shell_exec("my_local_shell.sh 192.168.1.1 root 2222");
echo <pre>$output</pre>;

屏幕上没有打印任何内容,文件中的 SSH 命令也没有执行。

我知道我可以使用ssh2_shell(),但是通过使用它我必须在 PHP 中发送命令,这不是我想要的。
我已经授予了index.phpmy_local_shell.sh 所需的权限

有什么想法可以做到这一点吗?

【问题讨论】:

  • php 是否使用与您尝试的用户相同的用户运行?
  • 是的,同一用户。
  • 如果您通过网络服务器运行脚本,则该脚本使用与网络服务器相同的用户运行,通常称为 http 或 www-data。首先通过 CLI 尝试。还要检查 php.ini 是否有禁用的功能。
  • 我已经试过了。它不显示任何错误或警告,也不起作用。当我尝试将 ssh 命令的结果直接写入本地文件时,它会创建日志文件(用户 www-data),但其中没有任何内容。
  • 试试exec,可以传一个参数来填充输出:php.net/manual/en/function.exec.php

标签: php bash shell ssh


【解决方案1】:

显然 scp 使用了某种你无法捕获的 ncurses,因此你可以在 shell 脚本中的 scp 命令中添加 -v 标志

scp -v -P $port $user@$host:/home/remote/file.log /home/local/file.log

或者,由于 scp 在成功时返回 0,您可以编写

scp -P $port $user@$host:/home/remote/file.log /home/local/file.log && echo Success

至于 PHP,请检查您是否有 PHP 开始和结束标记并更正您的 echo 语句

echo "<pre>".$output."</pre>";

【讨论】:

  • 它不会起作用,因为之前的命令 (ssh -p $port $user@$host 'ls -lart &gt;&gt; /home/remote/file.log' ) 会失败并且不会创建日志文件。如果我不使用 SSH 命令一切正常。但我想从远程主机检索信息,所以我必须使用 SSH。我的回声是正确的,我只是在这里打错了......
  • 回声没问题,但是你说 ssh 会失败是什么意思?您是否设置了基于密钥的登录?你指定的路径是否正确?
  • 是的。我可以通过终端正常登录而无需密码。如果我只在我的 shell 脚本上使用其他命令,它就可以工作。