在linux中使用Python创建SFTP用户

在linux中使用Python创建SFTP用户,python,linux,sftp,Python,Linux,Sftp,我创建了以下内容以在linux服务器中创建SFTP用户。有没有更好的方法来实现这一点?该脚本在检查用户是否已存在后生成用户名。然后提示用户是否要生成随机密码或是否要创建自己的密码。之后,它会获取用户名和密码,并创建一个新用户,将其添加到具有通过sftp上传权限的组中。我最关心的是如何大量使用操作系统 #!/usr/bin/env python import pwd import string import random import os from getpass import getpass

我创建了以下内容以在linux服务器中创建SFTP用户。有没有更好的方法来实现这一点?该脚本在检查用户是否已存在后生成用户名。然后提示用户是否要生成随机密码或是否要创建自己的密码。之后,它会获取用户名和密码,并创建一个新用户,将其添加到具有通过sftp上传权限的组中。我最关心的是如何大量使用操作系统

#!/usr/bin/env python

import pwd
import string
import random
import os
from getpass import getpass

def generate():
        global username
        username = raw_input("Enter username: ")
        try:
                pwd.getpwnam(username)
                print "Username already exists."
                generate()
        except:
                pass_generator()
                return username

def pass_generator():
        global password
        confirm = raw_input("Randomly generate password? (y/n): ")
        if confirm == "y":
                password = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(6))
        elif confirm == "n":
                p1 = getpass("Enter password: ")
                p2 = getpass("Confirm password: ")
                if p1 == p2:
                        password = p1
                else:
                        print "Passwords do not match. Try again."
                        pass_generator()
        else:
                print "Type y for yes, n for no."
                pass_generator()

def create_account(Username, Password):
        os.system('sudo useradd -d /home/clients/%s -s /usr/libexec/openssh/sftp-server -g sftp-only %s' % (Username, Username))
        os.system('sudo chown root:integration /home/clients/%s' % (Username))
        os.system('sudo chmod 777 /home/clients/%s' % (Username))
        os.system('echo %s:%s | sudo chpasswd' % (Username, Password))

def main():
    generate()
    create_account(username, password)
    print "User %s has been successfully created with password %s" % (username, password)

if __name__ =='__main__':main()

您可以使用
subprocess.popen()
。它比操作系统更安全,并且允许您访问标准缓冲区


当然有更好的方法:去掉全局变量,用函数参数替换它们。调用系统实用程序(如
useradd
)无法绕过
os.system
。另外,
generate()
中的try-except逻辑虽然形式正确,但完全不惯用(如果尝试失败,将导致堆栈溢出)。尝试使用
getpwnam
返回的值和循环。在许多情况下,裸露的
except
子句可能会给您带来麻烦,例如,当您按
^C
时;避免使用它。@rbart65您也可以使用它,我认为它应该可以使用。@SidharthShah根据python版本的不同,您应该为所有命令使用向前移动的子进程。自2.6.0版以来,命令一直被弃用。在
os.system
使用问题上达成一致意见-根据环境和暴露情况,可能很容易受到损害#炮击。要么考虑消毒输入更多。在
chmod 777
行上,用户名“
。/../*
”或类似名称将使您的所有
/
文件夹都可以读写。但这很容易对用户名进行清理。在事物周围添加双引号可能会有所帮助,但仍然会受到SQL风格的注入攻击。不允许在密码中使用空格、点、连字符和斜杠可以减轻很多负担。@9000如果用户不在系统中,
getpwnam
将返回一个
namererror
,因此我使用try-except。我可以将其更改为
commands.getstatusoutput
,如果用户存在,它会给我一个0,如果用户不存在,它会给我一个256。在这种情况下,循环将如何帮助我?为什么我不使用if-else语句呢?当我使用
subprocess.Popen()
时,它只是在放弃之前执行第一个命令。编辑:必须放置
subprocess.Popen().wait()
,在进入下一个命令之前完成该命令