2014-10-01 4 views
0

다음을 작성하여 Linux 서버에 SFTP 사용자를 만들었습니다. 이것을 구현하는 더 좋은 방법이 있습니까? 스크립트는 사용자가 이미 있는지 확인한 후 사용자 이름을 생성하여 작동합니다. 그런 다음 임의의 암호를 생성할지 또는 자신의 암호를 만들지 묻는 메시지를 표시합니다. 이후에 사용자 이름과 암호를 가져와 sftp를 통해 업로드 할 권한이있는 그룹에 새 사용자를 추가합니다. 나는 주로 os.system을 많이 사용하는 것에 관심이있다.Python을 사용하여 Linux에서 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() 
+0

은 물론 더 좋은 방법이 다음 전역 제거하고 함수 매개 변수로 교체하세요. 'useradd'와 같은 시스템 유틸리티를 호출하는 방법은'os.system'을 둘러 볼 방법이 없습니다. 또한,'generate()'의 try-except 논리는 공식적으로는 정확하지만, 완전히 비 관례 적입니다. 그리고 충분히 실패한 시도는 스택 오버 플로우를 유발할 것입니다. 'getpwnam'이 반환하는 값과 루프를 사용해보십시오. 벌어지는'except' 절은 많은 경우에 문제를 일으킬 수 있습니다. '^ C'을 누르면; 그것을 피하십시오. – 9000

+0

@ rbart65 [명령] (https://docs.python.org/2/library/commands.html#commands.getstatusoutput)을 사용할 수도 있습니다. 제대로 작동해야한다고 생각합니다. –

+1

@SidharthShah 파이썬 버전에 따라 모든 명령에 대해 하위 프로세스로 이동해야합니다. 명령은 2.6 이후로 더 이상 사용되지 않습니다. –

답변

1

subprocess.popen()을 사용할 수 있습니다. os.system보다 안전하며 표준 버퍼에도 액세스 할 수 있습니다.

https://docs.python.org/2/library/subprocess.html

+0

'subprocess.Popen()'을 사용하면 포기하기 전에 첫 번째 명령 만 실행합니다. – rbart65

+0

편집 : 다음 프로세스로 이동하기 전에'subprocess.Popen(). wait()'명령을 완료해야합니다. – rbart65

관련 문제