【问题标题】:Ruby: Execute php commands via SSHRuby:通过 SSH 执行 php 命令
【发布时间】:2018-02-14 00:57:37
【问题描述】:

我正在尝试在 ruby​​ shell 中运行 PHP 脚本。虽然如果我直接在 ssh 终端中使用 sn-p 它可以完美运行,但如果使用 ruby​​ 执行它会返回错误:

zsh:1: command not found: php

将下面的脚本与ls 之类的命令一起使用可以正常工作。

require 'rubygems'
require 'net/ssh'

host = "abc.de"
user = "user_xy"
pass = "user_pass"

begin
    Net::SSH.start(host, user, :password => pass) do |ssh|
        $a = ssh.exec! "cd xy_dir && php abc.phar do_this"
        ssh.close
        puts $a     
end
rescue 
    puts "Unable to connect to #{host}."
end

如何使用Net::SSH 运行 PHP?

感谢您的帮助

【问题讨论】:

  • 1) 您是否尝试过在 Ruby 中执行`ssh host password command`?这可能有助于缩小问题的范围。 2)我建议删除ssh.close 命令;当块终止时,ssh 会话将自动关闭。 (带有块的 File.open 也可以这样工作。) 3)您可能需要在传递给 shell 的任何字符串上使用Shellwords.escape。 4) 你不应该需要require 'rubygems'。 5) 你确定两种情况(成功和失败)都在同一台主机上运行吗?
  • 关于上面的(1),问题可能与SSH运行命令的环境有关。主机上的 PHP 可执行文件在哪里?当您 ssh 到机器时,该文件夹是否在 $PATH 中?
  • @KeithBennett 1) 我不确定你的意思。我只是在学习 Ruby,但我对 Javascript 和 PHP 有一些经验。 2)好的, ssh.close 被删除。 3) 我试过 Shellwords.escape 但它返回 zsh:1: no such file or directory: ... 4) 谢谢,也删除了 5) 是的,绝对。我复制并粘贴了命令并运行。
  • @TomLord 你能具体说明你的意思吗?就像我上面所说的,sn-p 正在运行。代码示例中的缩短版本实际上指向实际文件中的 ~/.php/abc.phar。
  • @D.Ne 在命令行上执行php 时,实际运行的是什么可执行文件?试试看:which php,也看。现在,运行:echo $PATH,您还应该看到 php 可执行文件所在的文件夹。现在,尝试通过 ruby​​ 脚本执行上述操作。有什么区别?

标签: php ruby ssh


【解决方案1】:

我认为问题不在于 Ruby 本身,而可能在于任何语言的 SSH 实现。当使用该语言的 ssh 支持来创建 ssh 会话时,它不会创建 login shell(它将读取初始化文件,例如 .bashrc),而是创建机器的较低级别接口。

因此,当与 Ruby 的 Net::SSH 连接时,您期望从正常的 shell 使用中获得的一些功能将会丢失。

我在想可能有一种方法可以通过调用bash -l -c "[the commands]" 来解决这个问题,强制使用bash-l 标志和-c 命令说明符的登录shell,但无法得到它工作。

我确实发现了另一个 SO 问题,其答案讨论了一个可能不值得尝试的尴尬解决方法:ruby net-ssh login shell

【讨论】:

    最近更新 更多