【问题标题】:php calling bash script with sshphp 用 ssh 调用 bash 脚本
【发布时间】:2016-04-14 12:57:23
【问题描述】:

尝试从 php 执行 bash 脚本(内部带有 ssh 命令),但不能像在 CLI 上那样执行。

这是 bash 脚本的 sn-p (deploy_to_nagios.sh):

#!/bin/bash -x
SERVER=$1
CARRIER=$2
MANAGEMENT_NAGIOS_SERVER=$3
MANAGEMENT_NAGIOS_USER=$4

ssh -q ${MANAGEMENT_NAGIOS_USER}@${MANAGEMENT_NAGIOS_SERVER} "ls /usr/local/nagios/health_check_${CARRIER}.cfg"

在 CLI 中运行 deploy_to_nagios.sh 成功返回,但是在使用 php 执行时

$exec3 = shell_exec('deploy_to_nagios.sh '.' '.$server.' '.$carrier.' '.$nag_manage_server.' '.$nag_manage_user);

找不到文件。我的猜测是 php 单独运行 ssh 和 ls 命令,这就是找不到文件的原因。 有没有办法让 php 执行的行为与 CLI 上的行为相同,将这两个命令视为一个?

【问题讨论】:

  • 澄清:deploy_to_nagios.sh 或 /usr/local/nagios/health_check_${CARRIER}.cfg 找不到?
  • 不确定你说的是哪个文件找不到,但如果你担心,那为什么不直接使用文件的完整路径呢?
  • 通过 php 执行 deploy_to_nagios.sh 时找不到“/usr/local/nagios/health_check_${CARRIER}.cfg”。但是在通过 CLI 执行 deploy_to_nagios.sh 时可以找到该文件。我猜php正在执行“ls /usr/local/nagios/health_check_${CARRIER}.cfg”作为来自 ssh -q ${MANAGEMENT_NAGIOS_SERVER${MANAGEMENT_NAGIOS_USER} 的单独命令命令,因此它可能会在本地服务器上查找它在 ${MANAGEMENT_NAGIOS_USER} 上?

标签: php linux bash


【解决方案1】:

这个项目将允许 PHP 通过 ssh 获取一个真实的 Bash shell 并与之交互。在这里获取:https://github.com/merlinthemagic/MTS

然后触发您的 bash 脚本或直接执行命令。直接让您处理返回,而不是在 bash 中构建异常逻辑。

下载后您只需使用以下代码:

//get a remote bash shell on server: MANAGEMENT_NAGIOS_SERVER
$shell = \MTS\Factories::getDevices()->getRemoteHost(MANAGEMENT_NAGIOS_SERVER)->getShellBySsh(MANAGEMENT_NAGIOS_USER, 'secretPassword');

//execute the ls command (--color=none to avoid special chars from terminal colors)
$return1  = $shell->exeCmd('ls --color=none /usr/local/nagios/health_check_${CARRIER}.cfg');

echo $return1; //ls return

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多