Python秘密鍵なしsshリモートログイン実行コマンドandローカル実行shellコマンド

3817 ワード

pythonリモート実行
python paramikoモジュールの応用
環境
# yum install python-dev
# yum install python-devel
# pip install pycrypto
# pip install paramiko
# pip install ssh

メソッドボディ
import paramiko
def DiskCheck(ip):
    try:
        #     sshclient  
        ssh = paramiko.SSHClient()
        #              host_allow   ,       connect     
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        #      RSA    ,              ,password      ,      password  
        # pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='12345')
        pkey = paramiko.RSAKey.from_private_key_file('/home/ptop/topicjie/scripts/keys/id_rsa')
        #     
        ssh.connect(hostname=ip,
                    port=22,
                    username='ptop',
                    pkey=pkey)
        #     
        stdin, stdout, stderr = ssh.exec_command("for i in $(df -h|grep data|awk '{print $6}'); do  touch $i/test.txt; done; df -h|grep data")
        #     stdout ,        stderr 
        print(stdout.read().decode())
        print(stderr.read())
        #     
        ssh.close()

ヒント:ssh秘密鍵なしでログインするモードを採用したほうがいいです.できるだけ明文パスワードが現れないようにしてください.
ネイティブ実行shellスクリプト
pythonにはcommandsなどのローカルshellスクリプトを呼び出す方法がたくさんありますが、現在はsubprocessを使用してローカルshellスクリプトの呼び出しを行うことが推奨されています.このモジュールの方法は多いです.
import shlex
import subprocess

def execute_command(cmdstring, cwd=None, timeout=None, shell=False):
    if shell:
        cmdstring_list = cmdstring
    else:
         cmdstring_list = shlex.split(cmdstring)
    if timeout:
        end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
        #                ,         ;
    sub = subprocess.Popen(cmdstring_list, cwd=cwd, stdin=subprocess.PIPE,shell=shell,bufsize=4096)
    #subprocess.poll()  :          ,     ,      ,  subprocess.returncode    
    while sub.poll() is None:
        time.sleep(0.1)
        if timeout:
            if end_time <= datetime.datetime.now():
                raise Exception("Timeout:%s"%cmdstring)

    return str(sub.returncode)
#    
p=execute_command("hive -f "+path)