LINUX.ORG.RU

Передать перенную из PHP в BASH скрипт


1

1

Доброе...

Подскажите, как передать переменную (ые) из php в bash. Как правильно определить переменную в баше?

вот простой скрипт на баше:

#!/bin/bash
export NAME="Имя"
echo $NAME

Вот код на php:

<?php
$name1="Иванов Иван Петрович";
system ('sudo /etc/apps/ect_user.sh');
?>

Что мне поменять, чтобы я смог передать из php имя в bash?

пробовал так:

system ('sudo /etc/apps/ect_user.sh', $name1);

Но результата нет...

в логах ошибки нет...

Прочитал про print('echo 123'), но не понял как ее поймать в баше... Подскажите пожалуйста)

$ php test.php 
User is Иванов Иван Петрович

$ cat test.php 
<?php
$name1="Иванов Иван Петрович";
system ("USER=\"$name1\" sh /tmp/test.sh");
?>

$ cat test.sh 
#!/bin/bash
echo User is $USER
ziemin ★★ ()
Ответ на: комментарий от ziemin

а теперь проверь свою программу для случая когда

<?php
$name1="Роберт\"; mkdir ~/DROP_TABLE_Students; # ";

:-) :-)

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

Скрипт без кавычек выводит

так странно что PHP-разработчики не сделали два аргумента в putenv() .. :-)

мне кажется они хотели запутать :-)

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

Скорее всего это от самой структуры окружения зависит. Там вроде так и есть - набор строк в формате 'X=Y'.

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

Что то у меня не то получается)

Вот поправил код на php:

<?php
putenv('NAME="Иванов Иван Иванович"');
system ('sh sudo /etc/apps/expect_vpn.sh');
?>

bash:

#!/bin/bash
export NAME
echo $NAME

не чего не получаю на выходе...

не то пишу?)

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

Экспорт убери. И sh в system не надо. Это я на скрипте без x-бита показывал.

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

Хрень какая то))))

Убрал, не помогло)

не пойму, а как в данном случае переменная передается и как она там ловиться)

или я напутал?)

putenv('NAME="Иванов Иван Иванович"');
system ('sudo /etc/apps/expect_vpn.sh');
firefedot ()
Ответ на: комментарий от firefedot

передаётся-то передаётся.. но только наверно она не ловится там :-)

в файле «expect_vpn.sh» напиши просто:

#!/bin/bash

env > ~/MY_TEST_ENV_FILE.txt # --- записать все переменные в файл

и поищи этот MY_TEST_ENV_FILE.txt

а если sudo не правильно отрабатывает — то можно попробовать без sudo запустить (чтобы точно знать что проблема в sudo.. но файл MY_TEST_ENV_FILE.txt в этом случае запишется в другой каталог)

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

Вот что выдал мне скрипт в файл MY_TEST_ENV_FILE.txt

SHELL=/sbin/nologin
TERM=xterm
USER=root
SUDO_USER=apache
SUDO_UID=48
USERNAME=root
MAIL=/var/mail/root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PWD=/var/www/html
LANG=C
SHLVL=1
SUDO_COMMAND=/etc/apps/expect_vpn.sh
HOME=/root
LOGNAME=root
SUDO_GID=48
_=/bin/env

Вообще теперь нить потерял)))

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

Убрал sudo и переменная передалась....

Но беда в том, что мне sudo нужно для скрипта...

Как быть или просто права на скрипт дать? Но он там за собой еще около 5 разных скриптов тянет)

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

Как заставить sudo правильотработать передачу переменных?

да точно — sudo очищает список переменных — делая это для целей безопасности..

то есть нужно заставить sudo работать НЕ правильно :) , или не пытаться передавать переменные через переменные-окружения.

(или не использовать sudo — например вызови скрипт «expect_vpn.sh» БЕЗ использования sudo, а уже внутри скрипта «expect_vpn.sh» — навставляй везде sudo там где надо на нужные команды :))

как-то так выходит..

вообще если что — man sudo .. и там какой-то ключ есть -E

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

делая это для целей безопасности

Кстати, передача переменных через putenv тоже не рекомендуется. Так в справке написано.

А в данном конкретном случае лучше выяснить у firefedot для чего ему sudo и что за переменные он собрался передавать в скрипт.

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

Кстати, передача переменных через putenv тоже не рекомендуется. Так в справке написано.

мне кажется — надо через socket-файл передавать данные, или через dBus.

(не вызывать скрипт «expect_vpn.sh» при каждом PHP-запросе — а держать нужый привилегированный демон — всегда в открытом состоянии)

но действительно — мы же не знаем что за цель у firefedot..

ды и может ему не нравится способ передачи инфы через socket-файл

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

Отвечу)

Я создаю пользователей для openvpn) может с этого надо было начинать?)

У меня написан скрипт, который заводит пользователя автоматом и попутно для него все, что мне нужно)

Но чтобы я смог это через веб-морду, мне нужно из морды передвать переменные имени и подобного.

Если я запущу скрипт без sudo, а уже внутри него через sudo запущу другой скрипт, то sudo все равно не даст передать ни какие переменные?

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

Внутри скрипта ты запустишь уже как-то так

sudo adduser "$USER"

И ничто тебе не помешает. Разумеется до этого ты должен сделать всякие проверки и т.д.

Так что пихай sudo в скрипт.

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

Не передаются переменные дальше)

вот php:

<?php
putenv('NAME="php_new_create_user_1"');
system ('/etc/apps/expect_vpn.sh');
?>

На выходе получаю:

spawn /etc/openvpn/easy-rsa/2.0/build-key-pass

А должен получить

spawn /etc/openvpn/easy-rsa/2.0/build-key-pass php_new_create_user_1

А вот скрипт, который вызывает другой скрипт):

#!/bin/bash
#/etc/apps/expect_vpn.exp
export NAME_U=$NAME
echo $NAME_U

sudo /etc/apps/expect_vpn.exp

Вот итоговый, который не получает переменную:

#!/bin/bash
#!/usr/bin/expect
export USER=$NAME_U

expect <<EOF
spawn /etc/openvpn/easy-rsa/2.0/build-key-pass $USER
...
expect EOF

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

А что если по-хитрому обойти?)

В скрипте, где вызываю sudo все переменные запихать в файл, а во втором скрипте их от туда считать?

И тем самым обойти систему защиты sudo)

Попробую)

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

А вот скрипт, который вызывает другой скрипт):

#!/bin/bash #/etc/apps/expect_vpn.exp export NAME_U=$NAME echo $NAME_U

sudo /etc/apps/expect_vpn.exp

Вот итоговый, который не получает переменную:

#!/bin/bash #!/usr/bin/expect export USER=$NAME_U

expect <<EOF spawn /etc/openvpn/easy-rsa/2.0/build-key-pass $USER ... expect EOF

первый скрипт:

#!/bin/bash
#это не надо --- #/etc/apps/expect_vpn.exp
#это не надо --- export NAME_U=$NAME
#это не надо --- echo $NAME_U

sudo /etc/apps/expect_vpn.exp "$NAME"

второй скрипт:

#!/bin/bash
#это не надо --- #!/usr/bin/expect
export USER="$1"

expect <<EOF
spawn /etc/openvpn/easy-rsa/2.0/build-key-pass "$USER"
...
expect EOF

ну то есть обрати внимание на строчку export USER="$1"

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

В скрипте, где вызываю sudo все переменные запихать в файл, а во втором скрипте их от туда считать?

не вздумай так делать :-) ни в коем случае .. иначе это приведёт к [состояние гонки]

(в момент когда будет совершенно паралельно одновременно два PHP-запроса)

и чтобы ликвидировать это состояние гонки — придётся думать ещё и об файловых блокировках.. а как я погляжу — а это ещё сложнее чем переменные на bash записывать :-)

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

А что если по-хитрому обойти?)

Кого или что ты собрался обходить? О каких (я так понимаю не одной) переменных идёт речь?

ziemin ★★ ()
#!/bin/bash
eval $1
echo $NAME
echo $SEX
<?php
$params="NAME=\"Иванов Иван Петрович\";SEX=male";
system ("sudo /etc/apps/ect_user.sh '$params'");
?>

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

sudo NAME=«Иванов Иван Иванович» /etc/apps/expect_vpn.sh

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

Состояние гонки понял) Спасибо)))

Сейчас попробую все советы)

Какой забавный утро у меня)

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

Пробую так:

#!/bin/bash
eval $1
echo $NAME
echo $SEX
<?php
$params="NAME=\"Иванов Иван Петрович\";SEX=male";
system ("sudo /etc/apps/ect_user.sh '$params'");
?>

Переменная не идет. но тут у меня проблема с кавычками, мать их)

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

Какие там кавычки и где они должны быть?)))

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

Решено)

Ну что, ура)

Добился результата, может не совсем правильно, но переменные идут куда надо.

Осталось русский язык нормально передать, а то квадратики идут в часть программ)

Для полноты картины: автоматом создаю ключи для openvpn из морды, попутно скриптом создаю учетку в Zimbr'e (сюда как раз русские буквы доходят квадратами, а из консоли нормально) и высылаю на почту админа архив с ключами и паролями))) плюс вношу все эти данные в БД (в коде его нет)

Приложу код, может пригодиться, а может и поправит кто)

Все это добро доступно только под впн, из вне или локалки не попасть, поэтому я вопросы безопасности не вывел на первый план, но займусь ими позже.

Спасибо всем помогавшим) Где тут плюсики вкарму ставить?)

Код самой страницы с вызовом (конечно будет форма):

<?php
$par='NAME="usertim_8"; ZIM="Pisya Kamushkin"; RU="RU"; OBL="SAM"; CITY="City"; COMP="RABOta"; OTDEL="otdel)"; NS="NameServer"';
system ("sudo /etc/apps/expect_vpn.sh '$par'");
?>

Первый скрипт, он вызывает второй, потому что expect через sudo не стал нормально работать): expect_vpn.sh

#!/bin/bash
eval $1

z=`tr -cd [:alnum:] < /dev/urandom | head -c8`
O_PASS=${z:0:10}

export USER=$NAME
export USER_ZIM=$ZIM
export USER_PASS=$O_PASS
export USER_RU=$RU
export USER_OBL=$OBL
export USER_CITY=$CITY
export USER_COMP=$COMP
export USER_OTDEL=$OTDEL
export USER_NAMESERVER=$NS
export USER_MAIL="$USER@mydomen.ru"

/etc/apps/expect_vpn.exp

Вот второй скрипт, там тупо expect) expect_vpn.exp

#!/bin/bash
expect <<EOF
spawn /etc/openvpn/easy-rsa/2.0/build-key-pass $USER
send $USER_PASS\n
send $USER_PASS\n
send $USER_RU\n
send $USER_OBL\n
send $USER_CITY\n
send $USER_COMP\n
send $USER_OTDEL\n
send $USER\n
send $USER_NAMESERVER\n
send $USER_MAIL\n
send \n
send \n
send y\n
send y\n

expect EOF

и файл создания ключей openvpn, не много измененный (build-key-pass):

#!/bin/sh
export KEY_DOWNLOAD_PATH=/etc/openvpn/backup
export KEY_PATH=/etc/openvpn/keys

export EASY_RSA=/etc/openvpn/easy-rsa/2.0

source /etc/openvpn/easy-rsa/2.0/vars

"/etc/openvpn/easy-rsa/2.0/pkitool" --interact --pass $*


# Упаковываем файлы сертификатов

zip -q $KEY_DOWNLOAD_PATH/$*-`date +%d%m%y`.zip $KEY_PATH/$*.crt $KEY_PATH/$*.key $KEY_PATH/ca.crt $
KEY_PATH/ta.key $KEY_PATH/dh2048.pem

echo "attachment" | mutt -x -s "go 3" admin@mydomen.ru -a $KEY_DOWNLOAD_PATH/$*-`date +%d%m%y`.zip

x=`tr -cd [:alnum:] < /dev/urandom | head -c8`
Z_PASS=${x:0:8}

/opt/zimbra/bin/zmprov ca $*@mydomen.ru userpass displayName "$USER_ZIM"

/opt/zimbra/bin/zmprov ma $*@mydomen.ru userPassword "$Z_PASS"
echo "$Z_PASS"

 # Готово)!
 echo ""
 echo "#############################################################"
 echo "Готово! Сертификат создан. Его можно взять от сюда:"
 echo "$KEY_DOWNLOAD_PATH/$*-`date +%d%m%y`.zip"
 echo "Так же этот файл отправлен на почту admin@mydomen.ru"
 echo "Создана учетная запись Zimbra:  $*@mydomen.ru"
 echo "displayName $USER_ZIM"
 echo "#############################################################"

Вооот! )))

firefedot ()
Ответ на: Решено) от firefedot

1. почему нельзя было всё сделать на пхп?

2. почему нельзя было где-то сделать файлик my.vars(создать средствами php), а потом этот файл включить source? РЕШЕТО конечно, за то простое.

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

Средствами пхп все нельзя, потому что нужно чтобы скрипты работали... у меня есть аналог того, что на пхп, только на баше.

Создание файликов средствами пхп, я попробовал, но там получается надо с правами мудрить, а так все работает ... кроме передачи руских букв)

из баша в баш нормально передаются. а тут кодировка... Хотя utf-8 везде...

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

Создание файликов средствами пхп, я попробовал, но там получается надо с правами мудрить

ну а так ты просто разрешил пхп скрипту выполнять ВСЁ от имени рута.

Надо было не так сделать. Надо было:

1. создавать файлик в доступном пхп каталоге

2. sudo может запускать только ОДИН скрипт

3. этот скрипт парсит файлик(не забывая о том, что в этом файлике вполне может быть rm -rf /)

Единственная «мудрость» здесь — сделать каталог, в который может только апач писать/читать (скрипт у тебя работает от рута, ему плевать на права)

из баша в баш нормально передаются. а тут кодировка...

вангую, что проблема у тебя в zip. Попробуй поменять его на tar.

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

а, ну и php забыл почти весь)

дыры обычно появляются не в самом пхп, а на стыке между пхп и чем-то ещё. Особенно если это что-то ещё запускаешь с правами рута.

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

С кодировкой решил вопрос Дописал в скрипт LANG=ru_RU.UTF-8 и по-русски внеслось, правда если два слова идет, то болт)

А с зипом ни каких контактов русских букв не было... он просто собирает файлики, они все на англ.языке...

По поводу файла и апача идея не плохая ... у меня просто все внутри впн и это пока не приоритетная задача .. хоя думаю, что заморочусь, но надо будет пхп вспоминать)

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