Я пытаюсь запустить команды 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
Но всякий раз, когда я пытаюсь запустить kubectl virt через PHP, я получаю следующий вывод:
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"
В этот момент я полностью потерялся и даже не знаю, где искать проблему. Я благодарен за все ответы.
Я тоже думал об этом, но мой файл .bashrc выглядит следующим образом: gist.github.com/dorukalpulgen/4baed34f25ec970a7a7182da2471c9e6
$ssh->exec('kubectl virt'); в основном то же самое, что и ssh localhost 'kubectl virt'. Вы получаете ту же ошибку с ssh localhost 'kubectl virt'?
У меня точно такая же ошибка при запуске ssh localhost 'kubectl virt
Что ж, это исключает phpseclib как возможный источник проблемы, по крайней мере!






Когда вы выполняете специальные команды ssh, вы не используете интерактивную оболочку, и в зависимости от поведения вашей оболочки по умолчанию она может загружать или не загружать ваш файл .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-имя_плагина. Таким образом, вызывая which kubectl-virt, вы можете легко узнать, где находится ваш двоичный файл virt, и вызвать его напрямую, поэтому что-то вроде
$ssh->exec('~/.krew/bin/kubectl-virt')
должно сработать
Другой способ - изменить PATH самостоятельно, установка PATH=$PATH:~/.krew/bin должна заставить его работать, по крайней мере, в моем случае.
ssh localhost 'PATH=$PATH:~/.krew/bin kubectl virt'
работал хорошо.
Вы можете попытаться принудительно загрузить .bashrc в конфигурацию вашей оболочки, но лично я считаю, что это плохая практика, и команды ssh обычно не загружают файлы rc по какой-то причине, скорость выполнения команд и согласованность между системами — это первое, что приходит на ум. разум.
Что касается sudo, на самом деле это не так уж и удивительно, потому что без флагов -E или -i он не загрузит вашу текущую среду / не запустит интерактивную оболочку. См. https://unix.stackexchange.com/questions/228314/sudo-command-doesnt-source-root-bashrc для получения дополнительной информации.
Можно ли определить эту команду как псевдоним? Может быть, у вас есть что-то в вашем
.bashrcфайле?