簡體   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