使用 python 脚本从本地 linux 主机验证用户
authenticate a user from local linux host using python script
我想使用子进程从本地 linux 主机验证用户。我使用过这段代码,但我怀疑 login
是一个完美的命令,因为登录命令提示输入密码,我想预先提供密码。 login man
如果不是 login
那么是否有任何其他 linux 我可以通过它来验证本地用户的命令?
#!/usr/bin/python3
import subprocess
import cgi
print()
cred = cgi.FieldStorage()
username = cred.getvalue("user")
password = cred.getvalue("password")
# print(username)
# print(password)
cmd = f"echo {password} | sudo /usr/bin/login {username}"
# cmd = "ls -la"
print(cmd)
output = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, text=True)
print(output)
这是我目前得到的输出。
CompletedProcess(args='echo ashu234 | sudo /usr/bin/login ashu', returncode=1, stdout='')
你可以使用pexpect。除非你是 运行 你的脚本作为 root,否则你将需要为 sudo 提供密码(因为你必须为任何使用 sudo 的答案提供密码)。为了使脚本更具可移植性,还提供了一个 sudo 用户名,但如果使用 root,则可以对其进行硬编码。此代码是为 Ubuntu 21.10 编写的,可能需要为其他发行版更新字符串。我认为代码是不言自明的,您生成一个进程,与之交互并在执行期间期望某些响应。
import pexpect
sudo_user = 'whatever your sudo user name is'
sudo_password = "whatever your sudo user password is"
user_name = "whatever local user name is"
password = "whatever local user password is"
child = pexpect.spawn(f'/usr/bin/sudo /usr/bin/login {user_name}', encoding='utf-8')
child.expect_exact(f'[sudo] password for {sudo_user}: ')
child.sendline(sudo_password)
return_code = child.expect(['Sorry, try again', 'Password: '])
if return_code == 0:
print('Can\'t sudo')
print(child.after) # debug
child.kill(0)
else:
child.sendline(password)
return_code = child.expect(['Login incorrect', '[#\$] '])
if return_code == 0:
print('Can\'t login')
print(child.after) # debug
child.kill(0)
elif return_code == 1:
print('Login OK.')
print('Shell command prompt', child.after)
有关更多详细信息,请参阅文档 https://pexpect.readthedocs.io/en/stable/overview.html
我想使用子进程从本地 linux 主机验证用户。我使用过这段代码,但我怀疑 login
是一个完美的命令,因为登录命令提示输入密码,我想预先提供密码。 login man
如果不是 login
那么是否有任何其他 linux 我可以通过它来验证本地用户的命令?
#!/usr/bin/python3
import subprocess
import cgi
print()
cred = cgi.FieldStorage()
username = cred.getvalue("user")
password = cred.getvalue("password")
# print(username)
# print(password)
cmd = f"echo {password} | sudo /usr/bin/login {username}"
# cmd = "ls -la"
print(cmd)
output = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, text=True)
print(output)
这是我目前得到的输出。
CompletedProcess(args='echo ashu234 | sudo /usr/bin/login ashu', returncode=1, stdout='')
你可以使用pexpect。除非你是 运行 你的脚本作为 root,否则你将需要为 sudo 提供密码(因为你必须为任何使用 sudo 的答案提供密码)。为了使脚本更具可移植性,还提供了一个 sudo 用户名,但如果使用 root,则可以对其进行硬编码。此代码是为 Ubuntu 21.10 编写的,可能需要为其他发行版更新字符串。我认为代码是不言自明的,您生成一个进程,与之交互并在执行期间期望某些响应。
import pexpect
sudo_user = 'whatever your sudo user name is'
sudo_password = "whatever your sudo user password is"
user_name = "whatever local user name is"
password = "whatever local user password is"
child = pexpect.spawn(f'/usr/bin/sudo /usr/bin/login {user_name}', encoding='utf-8')
child.expect_exact(f'[sudo] password for {sudo_user}: ')
child.sendline(sudo_password)
return_code = child.expect(['Sorry, try again', 'Password: '])
if return_code == 0:
print('Can\'t sudo')
print(child.after) # debug
child.kill(0)
else:
child.sendline(password)
return_code = child.expect(['Login incorrect', '[#\$] '])
if return_code == 0:
print('Can\'t login')
print(child.after) # debug
child.kill(0)
elif return_code == 1:
print('Login OK.')
print('Shell command prompt', child.after)
有关更多详细信息,请参阅文档 https://pexpect.readthedocs.io/en/stable/overview.html