2016-12-12 5 views
1

ПОЖАЛУЙСТА, ЗАМЕЧАНИЕ ЗАМЕЧАНИЯ В КОДЕ ПОСЛЕ ФИ! Чтобы создать учетную запись пользователя через браузер, я позволю php shell_exec выполнить сценарий bash. Несмотря на то, что я уверен (путем проверки/etc/shadow), что имя пользователя не принято, скрипт говорит, что это так. Теперь скрипт выполняет команду useradd, и имя пользователя появляется в/etc/shadow. Похоже, что он выполняет useradd раньше, а затем проверяет, существует ли пользователь?bash script возвращает, что пользователь существует, но пользователь не существует

PHP

$command = "sudo ./createclientcert.sh $userName $userPass"; 
if(shell_exec("$command echo $?") == 0){ 
echo 1; 
} 

Shellscript

#!/bin/bash 

newclient() { 
getent passwd $1 > /dev/null 2&>1 
if [ $? -eq 0 ]; then 
echo $? 
else 
useradd $1 
echo $1:$2 | chpasswd 
fi 
# PLEASE TAKE NOTE!! funny thing is that when code (that had nothing to do with the account creation and was to be removed) that came after fi is in place it works well. 
} 

newclient "$1" "$2" 
+0

'getent PASSWD $ 1>/DEV/нуль 2 &> 1 'не может быть правильным. Это должно было быть 'getent passwd $ 1>/dev/null 2> & 1' – sjsam

+0

Кроме того, не следует' shell_exec («$ comm echo $?») 'Was' shell_exec ("$ command echo $?") ' ?? – sjsam

+1

@sjsam $ comm был опечатка. Простите за это. действительно, 2 &> 1 должно быть 2> & 1, когда я быстро googlecheck, но я скопировал и вложил его из другого сообщения. –

ответ

0

Попробуйте что-то вроде этого:

#!/bin/bash 

if useradd "$1" >/dev/null ; then 
    echo $1:$2 | chpasswd >/dev/null 
    # user created 
    exitcode=0 
else 
    # user already exists 
    exitcode=1 
fi 

# do stuff regardless if user created or not 
7z a /var/www/html/download/$1.zip /var/www/html/download/$1.ovpn 

# the script would exit with the exit code of latest executed command 
# if you dont explicitly give another exit code: 
exit $exitcode 

PHP

$output = system("sudo ./createclientcert.sh \"$userName\" \"$userPass\"", $exitcode); 

switch($exitcode) 
{ 
    case 0: 
    echo "User created." 
    break; 
    case 1: 
    echo "User already exists."; 
    break; 
} 
+1

:-) THNX! Edites этот мир php '$ output = system ("sudo ./cert.sh $ userName $ userPass $ exitcode"); и теперь он работает так, как должен. Я очень благодарен! –

+0

Извините. Я был слишком быстр. Это не работает. Я расследую. –

+0

Каков ваш текущий скрипт? Вы пробовали сценарий оболочки выше? –

0

Какой выход при запуске этого в системе?

getent passwd [username] 

Вполне возможно, что запись для этого пользователя находится в одном из следующих, так как getent ищет эти места, а не только /etc/shadow:

Базы данных он ищет в являются: ahosts, ahostsv4, ahostsv6, псевдонимы, эфиры (Ethernet-адреса), group, gshadow, hosts, netgroup, networks, passwd, протоколы, rpc, службы и тень.

Источник: https://en.wikipedia.org/wiki/Getent

Попробуйте удалить пользователя:

userdel -r [username] 

где -r удалит все файлы пользователя вместе с самим пользователем. После этого попробуйте запустить скрипт PHP еще раз.

+0

Это не производственная машина с большим количеством пользователей или около того. Таким образом, факт, что я уверен, что данное имя пользователя не существует, основано на этом. –

+0

И я проверил его, выпустив его через терминал. Ввод «getent passwd jajaja» переходит в другую строку без вывода. Пользователь jajaja явно представляет собой несуществующее имя пользователя. :) И обратите внимание на замечание, что при наличии другого кода все выполняется хорошо. Бизарная вещь, учитывая тот факт, что код не имеет ничего общего с созданием учетной записи пользователя, но имел эффект задержки или что-то еще? –

0

Не совсем ответ, но он работает, оставляя глупый 7z на месте. Bizar !!

#!/bin/bash 

newclient() { 
getent passwd $1 >/dev/null 2>&1 
if [ $? -eq 0 ]; then 
echo $? 
else 
useradd -p encrypted_password $1 
#useradd $1 
echo $1:$2 | chpasswd 
fi 
# if i remove the following line or comment it out the script starts malfunctioning 
7z a /var/www/html/download/$1.zip /var/www/html/download/$1.ovpn 
} 

newclient "$1" "$2" 
Смежные вопросы