Virtctl работает при выполнении через командную строку, но не из 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

Но всякий раз, когда я пытаюсь запустить 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 файле?

neubert 09.05.2022 16:41

Я тоже думал об этом, но мой файл .bashrc выглядит следующим образом: gist.github.com/dorukalpulgen/4baed34f25ec970a7a7182da2471c9‌​e6

iristhennars 09.05.2022 22:19
$ssh->exec('kubectl virt'); в основном то же самое, что и ssh localhost 'kubectl virt'. Вы получаете ту же ошибку с ssh localhost 'kubectl virt'?
neubert 10.05.2022 00:20

У меня точно такая же ошибка при запуске ssh localhost 'kubectl virt

iristhennars 10.05.2022 00:36

Что ж, это исключает phpseclib как возможный источник проблемы, по крайней мере!

neubert 10.05.2022 00:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
5
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы выполняете специальные команды 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 для получения дополнительной информации.

Другие вопросы по теме