我试图运行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相关问答推荐

msgraph-sdk-php v2如何传递skiptoken到request?

与会者在WooCommerce中按购物车项目数量自定义 checkout 字段

根据在WooCommerce购物车和 checkout 中 Select 的送货方式显示快捷代码内容

MULTI UPDATE Laravel为什么只能更新我的第一行

将数组推送到数组时,数组推送()出现问题

免费送货柜台,考虑到折扣码

如何在汇总表构建器中操作LALAVEL细丝Sum::Make()值

Laravel区分大小写搜索

将WooCommerce WC_Order对象与wp_Schedule_Event一起使用

我有一个显示记录的表格,每行在最右边有两个按钮.如何才能以正确的顺序获得表的值?

在WooCommerce中添加特定产品类型的百分比费用和固定费用

根据类别的数量折扣更改WooCommerce购物车商品价格

在WooCommerce购物车页面应用优惠券不会';t刷新总计

根据小计向 WooCommerce Checkout 添加佣金

WooCommerce 按产品运输插件:仅收取较高的运输费用

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

Symfony:指定 data_class 时,提交的表单获取初始化前不得访问

后退按钮不起作用 laravel ajax crud

基于其他数组创建多维数组 struct

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