LINUX.ORG.RU

SSH не отправляется команда

 


0

1

С основного сайта захожу по SSH на удаленный сервер с помощью PHP. На нем пытаюсь выполнить команду:

$ssh->exec_cmd('lxc-attach -n server3');
Для авторизации в виртуалку server3. Но последующие ssh запросы всеравно идут в основую ос а не в виртуалку. Пробовал завернуть в screen, результат тотже



Последнее исправление: User01 (всего исправлений: 1)

На нем пытаюсь выполнить команду

В bash/dash/etc такой команды нет, это что за синтаксис?

anonymous
()

На нем пытаюсь выполнить команду

Эт что за конструкция такая? UPD: А, это php что ли?

Если вы делаете что-то типа ssh server 'lxc-attach -n server3' ; ssh server 'uptime' то у вас каждый раз новая сессия открывается.

Простой вариант - не используйте attach а подключайтесь к контейнеру по ssh. Придется настроить сеть если еще не сделали, да.

micronekodesu ★★★
()
Последнее исправление: micronekodesu (всего исправлений: 1)
Ответ на: комментарий от micronekodesu

сеть настроена но у vds даже openssh-server не установлен и пароль. Я собственно и хочу задать это через атач. Я пробовал такой костыль. Запускал lxc-attach -n… в скрин, потом в этот скрин отправлял команду. Но она всеравно не принималась, возможно что у скрина нету таких прав чтоли

User01
() автор топика
Последнее исправление: User01 (всего исправлений: 1)
Ответ на: комментарий от User01

сеть настроена но у vds даже openssh-server не установлен и пароль.

Так вы как-то туда попадаете же оО

Но я про ssh в самих контейнерах.

Ну окей, вы можете передавать команды через lxc-attach после двух тире, вот так: lxc-attach -n server3 -- /foo/bar/ololo arg1 arg2

micronekodesu ★★★
()
Ответ на: комментарий от User01

Но не все так гладко.

$ssh->exec_cmd('lxc-attach -n vps'.$id.' -- mkdir /root/test;echo "nameserver 8.8.8.8" > /etc/resolv.conf;exit');
папку создало на вдс а вот правку в resolv не внесло
lxc-attach -n vps1 -- mkdir /55555; mkdir /4444
странность какая, первую папку создает на вдс, вторую на корневой машине

User01
() автор топика
Последнее исправление: User01 (всего исправлений: 1)
Ответ на: комментарий от User01

странность какая

Ничего странного, вы просто не до конца понимаете как работает shell - ; служит для разделения команд. Соответственно ваша команда оболочкой воспринимается как две lxc-attach -n vps'.$id.' -- mkdir /root/test и потом echo "nameserver 8.8.8.8" > /etc/resolv.conf (ну и exit). Вторая команда выполняется локально. Вам нужно использовать кавычки, чтоб оболочка понимала что это одна команда, вот так - $ssh->exec_cmd('lxc-attach -n vps'.$id.' -- \'mkdir /root/test;echo "nameserver 8.8.8.8" > /etc/resolv.conf;exit\''); (я не знаю точно как работает экранирование в php, но думаю принцип понятен).

micronekodesu ★★★
()
Ответ на: комментарий от micronekodesu
lxc-attach -n vps1 -- 'mkdir /root/test;echo "nameserver 8.8.8.8" > /etc/resolv.conf'

вот так не хочет, дает ошибку

lxc-attach: attach.c: lxc_attach_run_command: 1292 No such file or directory - Failed to exec "mkdir /root/test;echo "nameserver 8.8.8.8" > /etc/resolv.conf".

Кстати даже вот так не работает, не вносит правки в vds, а пишет в корневую машину

lxc-attach -n vps1 -- echo "nameserver 8.8.8.8" > /etc/resolv.conf

User01
() автор топика
Последнее исправление: User01 (всего исправлений: 2)
Ответ на: комментарий от User01

Кстати даже вот так не работает, не вносит правки в vds, а пишет в корневую машину

Ну все та же проблема - вы не понимаете как shell будет выполнять вашу команду, отсюда и удивление когда она выполняется не так, как вы задумали. Почитайте документацию или заведите топик в www.linux.org.ru/forum/job/ чтоб это сделали за вас и написали работающий скрипт.

вот так не хочет, дает ошибку

Я бы рекомендовал не пользоваться этим - то как все это работает это отличный вариант выстрелить себе в ногу, в том числе и на том хосте, откуда подключаетесь. Потому что тут надо очень хорошо знать что и как работает и интерпретируется, есть большой шанс что очередной rm не улетит в контейнер, а запустится локально. Я бы настроил нормальный ssh в контейнеры или, если такой возможности нет, закидывал бы скрипты и запускал уже их, не пытаясь сделать это в формате однострочника.

micronekodesu ★★★
()
Ответ на: комментарий от micronekodesu

да тут что-то не так, видимо ключ какой-то еще надо указывать после — потому что банально

lxc-attach -n vps1 -- echo "text" > /tttt.txt
пишет в корневую машину.

User01
() автор топика
Ответ на: комментарий от User01

А проблема всё та же.

Вызывайте экземпляр шелла и делайте всё внутри. lxc-attach -n vps1 -- sh -c "echo xxx>yyy && rm -rf /*"

anonymous
()
Ответ на: комментарий от anonymous

спасибо, часть кода начало выполнять. Но вот поставить пароль руту не хочет, подозреваю что не хватает прав

lxc-attach -n vps1 -- sh -c "echo \'root:'.$vdsRootPass.'\'|chpasswd root"

User01
() автор топика
Ответ на: комментарий от User01

Все работает. Спасибо. Надо было просто закрыть путти и снова открыть

User01
() автор топика
Последнее исправление: User01 (всего исправлений: 1)

А нельзя сделать что-то в виде $ssh->exec_cmd('lxc-attach -n server3 bash -i');, получить в переменную дескриптор/сокет этого подключения, а потом писать в него команды и читать ответ ?

Тогда не нужно будет извращаться над созданием километровых команд, экранированием кавычек/апострофов и т.п.

Через proc_open() такое можно делать.

spirit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.