我正在尝试设置一个集中服务器,负责监视我的其他服务器。该集中式服务器需要能够收集关于特定服务器(例如df -h
和service httpd status
)的特定信息/度量;但如果需要,它还需要能够重新启动Apache。
如果不是Apache重新启动,我可以编写一个侦听脚本,提供一种方法,在不需要SSH的情况下为集中式服务器提供所需的数据。但因为我也希望它能够重新启动Apache,所以它需要能够通过PHP和Bash的组合登录并启动脚本。
目前,我正在使用PHP的shell_exec
来执行这个(非常简单)Bash脚本:
#!/bin/sh
ssh -i /path/to/keyFile.pem ec2-user@x.x.x.x;
我正在通过一个私有IP访问外部服务器(它是一个EC2实例)。如果我启动这个脚本,我可以毫无问题地登录——然而,当我想要发回上面列出的命令的输出时,问题就来了。
在Bash脚本中,如何在SSHing之后将类似df -h
的命令输出到另一台服务器?这可能吗?
SSH有一个PECL扩展。
除此之外,您可能希望使用exec()
的&$output
参数来获取输出:
$output = array();
exec('bash myscript.sh', $output);
print_r($output);
或者使用输出重定向
$output = '/path/to/output.txt';
exec("bash myscript.sh > $output");
if( file_exists($output) && is_readable($output) ) {
$mydata = file_get_contents($output);
}
当然,这一切都是假设你的剧本看起来像杰伦的答案。
您可以使用:
ssh -i /path/to/keyFile.pem ec2-user@x.x.x.x 'df -h'
或用于多个命令:
ssh -i /path/to/keyFile.pem ec2-user@x.x.x.x 'ls -al ; df -h'
这在命令行中有效,但我没有通过php的exec
尝试过(老实说,在亚马逊上也没有…)
如果你在做ssh,我建议你使用phpseclib,一个纯PHP ssh实现。它比PECL SSH扩展更便携,也更可靠。