我试图运行kubectl virt命令,通过PHP管理我的虚拟机.首先,我使用phpseclib登录到我的服务器,代码如下:

$ssh = new SSH2('localhost');
if (!$ssh->login('root', 'rootPassword')) {
    throw new \Exception('Login failed');
}

这部分工作正常,当我try 运行$ssh->exec('whoami && echo $PATH')时,我得到以下输出:

root
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

但是,每当我try 通过PHP运行kubectl virt时,我都会得到以下输出:

error: unknown command "virt" for "kubectl"

当我通过终端运行kubectlkubectl virt时,它们工作得非常好,但不知何故,它们不能与PHP exec()一起工作.我还试着判断$PATH via终端,得到了不同的输出:

/root/.krew/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

我认为这可能是因为$PATH,但有趣的是,当我试图通过终端运行sudo kubectl virt时,我也会得到相同的错误:

error: unknown command "virt" for "kubectl"

在这一点上,我完全迷路了,甚至不知道到哪里go 找问题.我感谢所有的答案.

推荐答案

当您发出特别的ssh命令时,您没有使用交互式shell,根据您的默认shell行为,它可能会也可能不会加载您的命令.bashrc文件.详见https://serverfault.com/questions/936746/bashrc-is-not-sourced-on-ssh-commandRunning command via ssh also runs .bashrc?.

因此,默认情况下,krew修改您的PATH变量,并将其bin路径附加到它,即我的配置包含export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH".但kubectl插件到底是什么?通常它只是一个二进制文件,名字是kubectl-plugin_name.所以通过调用which kubectl-virt,你可以很容易地知道你的virt二进制文件在哪里,并直接调用它,比如

$ssh->exec('~/.krew/bin/kubectl-virt')

应该管用

另一种方法是自己修改路径,设置PATH=$PATH:~/.krew/bin应该可以工作,至少在我的情况下是这样

ssh localhost 'PATH=$PATH:~/.krew/bin kubectl virt'

效果很好.

你可以试着强制加载.在shell配置中使用bashrc,但我个人认为这是一种不好的做法,ssh命令通常不会加载rc文件,这是有原因的,首先想到的是命令执行速度和系统之间的一致性.

关于sudo,这其实并不奇怪,因为如果没有-E-i个标志,它将无法加载当前环境/无法启动交互式shell.更多信息请参见https://unix.stackexchange.com/questions/228314/sudo-command-doesnt-source-root-bashrc

Php相关问答推荐

Woocommerce API 的 PHP Curl 附加参数

为 WordPress 页面创建新功能

PHP 合并/合并多维数组

在 laravel 中更新表单时如何在 Select 选项中保留旧值?

标头内容类型:image/jpeg 无效

将加密/解密函数从 PHP 转换为 NodeJS

Laravel - 按 SQL 表列对来自其他类的数组进行排序

doing_action() 函数阻止我的代码运行

表单操作未触发,而是重定向到 php 脚本

PHP从文本文件中读取行,仅 Select 行

是否可以在 php 中使用另一个 json 数组来验证 json 对象

如何使用选项运行在 composer.json 中创建的自定义命令?

如何在 PHP 中通过 AJAX 发送的 formData 中循环序列化数据追加?

PHPStan 没有将 Symfony EntityRepository 解释为泛型

在命令行执行一串PHP代码

布尔值切换/反转

在 PHP (>= 5.0) 中,通过引用传递是否更快?

强制composer 要求版本 X 和版本 Y 之间的 PHP 版本

判断字符串是否为unix时间戳

如何获取给定月份的第一天和最后一天