【问题标题】:bash script returns that user exists but user does not existbash 脚本返回用户存在但用户不存在
【发布时间】:2016-12-12 05:06:24
【问题描述】:

请注意 FI 后代码中的备注! 为了通过浏览器创建用户帐户,我让 php shell_exec 执行 bash 脚本。即使我确定(通过检查/etc/shadow)用户名没有被使用,脚本也说它确实如此。 现在的脚本确实执行了 useradd 命令,并且用户名出现在 /etc/shadow 中。 貌似之前执行了useradd,然后检查用户是否存在?

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"

【问题讨论】:

  • getent passwd $1 > /dev/null 2&>1 可能不正确。应该是getent passwd $1 >/dev/null 2>&1
  • 另外,shell_exec("$comm echo $?") 不应该是shell_exec("$command echo $?") 吗??
  • @sjsam $comm 是错字。对此感到抱歉。确实 2&>1 应该是 2>&1 当我快速 googlecheck 但我从另一个帖子复制并粘贴它时。
  • 看起来有点奇怪。你期望最终的输出应该是什么?实际输出是多少? “脚本说它确实”是什么意思?
  • 表示用户存在 $? = 0 并且 tgen 确实创建了它存在的帐户。但是请参阅我自己发布的答案,因为我认为这是不可复制的。

标签: php bash shell-exec


【解决方案1】:

试试这样的:

#!/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;
}

【讨论】:

  • :-) THNX!编辑这个和平的 php '$output = system("sudo ./cert.sh $userName $userPass $exitcode");'现在它可以正常工作了。非常感谢!
  • 对不起。我太快了。它不起作用。我正在调查。
  • 您当前的脚本是什么?你试过上面的shell脚本吗?
  • 别说昨天出了什么问题,但我一定是遭受了某种奇怪的失明。您的代码有效! :-)
  • 问题主要在于我必须对 bash 的结果做一些事情以将其回显给请求的客户端 (ajax)。但是来自 bash 的回声也是 php 中的回声。也许我有点愚蠢。非常感谢您为我提供答案。
【解决方案2】:

当你在系统上运行这个时输出是什么?

getent passwd [username]

此用户的记录可能存在于以下任一位置,因为 getent 搜索这些位置,而不仅仅是 /etc/shadow

它搜索的数据库是:ahosts、ahostsv4、ahostsv6、别名、ethers(以太网地址)、group、gshadow、hosts、netgroup、networks、passwd、protocols、rpc、services 和 shadow。

来源:https://en.wikipedia.org/wiki/Getent

尝试删除用户:

userdel -r [username]

-r 将删除用户的所有文件以及用户本身。 之后尝试再次运行 PHP 脚本。

【讨论】:

  • 这不是一台拥有大量用户的生产机器。因此,我确定给定用户名不存在的事实就是基于此。
  • 我通过终端发出它来检查它。输入“getent passwd jajaja”它会跳转到另一行,没有输出。用户 jajaja 显然是一个虚构的不存在的用户名。 :) 并请注意,当其他代码到位时,它都执行良好。考虑到代码与用户帐户创建无关但有延迟效果或其他什么,这很奇怪?
【解决方案3】:

不是真正的答案,但它可以让愚蠢的 7z 留在原地。奇葩!!

#!/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"

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多