Python函数仅在打印时有效

时间:2018-07-05 12:15:53

标签: python

这是为sftp auth创建UNIX凭据的代码。我注意到奇怪的症状,即如果我在终端中运行,则一切正常,并且输出通过sftp起作用的用户名和密码。但是,如果我删除了两行“ print(stdout.read())”,则该功能将无法完全起作用。帐户已设置,但密码未通过身份验证。不确定“ chpasswd”行是否有问题。

如果没有实际打印出stdout会导致代码失败(即使它看起来可以正常工作并且没有遇到异常),这又会是什么问题呢?

这些是我关注的内容:

    stdin, stdout, stderr = client.exec_command("adduser --disabled-password --gecos '' {}".format(ftp_username))
    print(stdout.read())
    stdin, stdout, stderr = client.exec_command("echo '{}:{}' | chpasswd".format(ftp_username, new_pass))
    print(stdout.read())

这是完整的代码:

def create_user(ftp_username):
    client = connect_paramiko()

    new_pass = passgen.passgen()
    appendSSH = '''

    Match User {}
     ForceCommand internal-sftp
     PasswordAuthentication yes
     ChrootDirectory /var/sftp7/{}
     PermitTunnel no
     AllowAgentForwarding no
     AllowTcpForwarding no
     X11Forwarding no
         '''.format(ftp_username, ftp_username)

    client.exec_command("mkdir -p /var/sftp7/{}/{}".format(ftp_username, ftp_username))
    client.exec_command("chown root:root /var/sftp7/{}".format(ftp_username))
    client.exec_command("chown root:root /var/sftp7")
    client.exec_command("chmod 755 /var/sftp7/{}".format(ftp_username))
    stdin, stdout, stderr = client.exec_command("adduser --disabled-password --gecos '' {}".format(ftp_username))
    print(stdout.read())
    stdin, stdout, stderr = client.exec_command("echo '{}:{}' | chpasswd".format(ftp_username, new_pass))
    print(stdout.read())
    client.exec_command("chown {}:{} /var/sftp7/{}/{}".format(ftp_username, ftp_username, ftp_username, ftp_username))
    client.exec_command("echo '{}' >> /etc/ssh/sshd_config".format(appendSSH))
    client.exec_command("systemctl restart sshd")
    client.exec_command("usermod {} -d /{}".format(ftp_username, ftp_username))

    return {"username":ftp_username, "password":new_pass

并且:

def connect_paramiko():
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('...', username='root', key_filename='/root/.ssh/id_rsa')
    return client

1 个答案:

答案 0 :(得分:-1)

第一行,它只是在没有任何密码的情况下创建用户

stdin, stdout, stderr = client.exec_command("adduser --disabled-password --gecos '' {}".format(ftp_username))
print(stdout.read())

在第二行echo username:password中,结果传递到命令chpasswd。这样做是因为当您运行命令chpasswd时,它将询问username:password。因此,如果我们将echo username:password的结果传递给chpasswd命令,它将不会要求其他输入。

stdin, stdout, stderr = client.exec_command("echo '{}:{}' | chpasswd".format(ftp_username, new_pass))
print(stdout.read())

更多

只需打开终端,首先必须运行以下命令:

man adduser

如果有一点运气,您会发现的。然后,在该手册页中键入: /-disabled-login ,然后按 Enter ,然后反复按n以查找所有包含-disabled-login的事件。 / strong>对-gecos 执行相同操作。

幸运的话,您会发现:

--disabled-login
          Do not run passwd to set the password.  The user won't be able 
          to use  her  account until the password is set.