这是为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
答案 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.