繁体   English   中英

virtctl 在通过命令行执行而不是从 php exec() 执行时有效

[英]virtctl works when executed via command line but not from php exec()

我正在尝试运行 kubectl virt 命令来通过 PHP 管理我的虚拟机。 首先,我使用 phpseclib 使用以下代码登录到我的服务器:

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

这部分工作正常,当我尝试运行$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

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

error: unknown command "virt" for "kubectl"

当我通过终端运行kubectlkubectl virt时,它们工作得非常好,但不知何故不适用于 PHP exec()。 我还尝试通过终端检查$PATH并得到不同的输出:

/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-command通过 ssh 运行命令也运行 .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=$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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM