2016-12-12 6 views
1

FIのコードに記入してください! ブラウザ経由でユーザーアカウントを作成するために、php shell_execにbashスクリプトを実行させます。私は/ etc/shadowをチェックすることで特定していますが、ユーザ名は使用されていないことをスクリプトが示しています。 これでスクリプトはuseraddコマンドを実行し、ユーザ名は/ etc/shadowに表示されます。 前にuseraddを実行して、そのユーザーが存在するかどうかを確認しますか?bashスクリプトは、そのユーザーは存在しますが、ユーザーは存在しません。

PHP

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

シェルスクリプト

#!/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/null 2>&1 '正しくない可能性があります。それは 'getent passwd $ 1>/dev/null 2>&1'だったはずです – sjsam

+0

また' shell_exec( "$ comm echo $?") 'は' shell_exec( "$ command echo $?") ?? – sjsam

+1

@sjsam $ commはタイプミスでした。そのために残念。私がgooglecheckをすばやく行うと2>&1になるはずですが、別の投稿からコピーして貼り付けています。 –

答えて

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!これはPHPの平和を編集します。$ output = system( "sudo ./cert.sh $ userName $ userPass $ exitcode");それは今通りに動作します。私はとても感謝しています! –

+0

申し訳ありません。私は速すぎました。それは動作しません。私は調査中です。 –

+0

現在のスクリプトは何ですか?上のシェルスクリプトを試しましたか? –

0

あなたがシステム上でこれを実行し、出力は何ですか?

getent passwd [username] 

このユーザーのレコードがにgetentは、これらの場所を検索していないだけで、次のいずれかに存在する/etc/shadowことは可能である:

それはで検索したデータベースは、次のとおりです。ahosts、ahostsv4、エイリアス、エーテル(イーサネットアドレス)、グループ、gshadow、ホスト、ネットグループ、ネットワーク、passwd、プロトコル、rpc、サービス、およびシャドウを含む。

出典:https://en.wikipedia.org/wiki/Getent

ユーザーを削除するようにしてください:

-rは、ユーザー自身と一緒に、ユーザーのファイルをすべて削除します
userdel -r [username] 

。 その後、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" 
関連する問題