![](/img/trans.png)
[英]PHP exec() will not execute shell command when executed via browser
[英]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"
當我通過終端運行kubectl
和kubectl 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.