我试图运行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"

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

推荐答案

当您发出特别的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相关问答推荐

在搜索表单查询中使用 PDO 准备语句 - PHP

否定正则表达式

Laravel:使用 HttpClient 的多个作业(job)的解决方案?

无法过滤过去 30 天的 SQL 数据

如何在 laravel 迁移中添加表格注释

计算数组内的数组? PHP

弹性豆茎与 laravel 特使

为 Blade 中的本地日期时间输入字段设置默认值

使用 PHP 判断 gmail 收件箱中的新邮箱

Laravel,sync() - 如何同步数组并传递额外的数据透视字段?

运行composer 时禁用 xdebug

如何测试字符串是否包含 PHPUnit 中的另一个字符串?

Laravel 5 显示 ErrorException file_put_contents 无法打开流:没有这样的文件或目录

WRONGTYPE 对持有错误值 php 的键的操作

获取数组的最后一个元素而不删除它的最佳方法是什么?

PHP中三个点(...)是什么意思?

有没有办法在 PHP 中扩展特征?

如何在不使用 Firebase 控制台的情况下发送 Firebase 云消息传递通知?

Laravel 有没有办法向请求数组添加值

给变量一个默认值的最好方法(模拟 Perl ||, ||= )