2017-11-28 23 views
1

10以上のリモートホスト上のファイルを更新する必要があります。私たちのシステムが設計された方法は、ユーザが$userと言っているが、パスワードを持つリモートホストにsshが$ passwdと言うと、成功したログインを投稿する。$userは(これは/etc/sudoersで定義されている)リモートマシンへのSFTP、ルートに切り替えてリモートマシン上でコマンドを実行

私の問題は、私は私のスクリプトからsudo su - rootすることができません、ということである、以下の私のコード

(注 - 私はすでにinvoke_shell()get_transport()を試してみました。)である私はRECE

import paramiko, re, os 
ssh_client = paramiko.SSHClient() 
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
action_item = int(input("Welcome on-board ...\nPlease choose from following \n1 - Global Update\n2 - Specific Update\n Please input as 1 or 2 :")) 
if action_item == 2: 
    hostName = input("Please provide 'IPADDRESS' of Specific Remote Client :") 
    os.system('touch /tmp/hosts_file_specific && umask 113 /tmp/hosts_file_specific') 
    os.system('hostName='+hostName+' && echo "$hostName" >> /tmp/hosts_file_specific') 
    hosts_file = r'/tmp/hosts_file_specific' 
elif action_item == 1: 
    hosts_file = r'/etc/hosts' 
else: 
    print("Invalid input, shutting down the application") 
with open(hosts_file) as file: 
    for line in file: 
     line = re.findall(r'[0-9]+(?:\.[0-9]+){3}',line) 
     if len(line) > 0: 
      line = line[0] 
     else: 
      line = '127.0.0.1' 
     if line == '127.0.0.1': 
      pass 
     else: 
      print("Trying to connect - "+line) 
      try: 

       ssh_client.connect(hostname=line,username=$user,password=$passwd) 
       stdin,stdout,stderr=ssh_client.exec_command("pgrep mttrapd") 
       outData = stdout.readlines(); 
       outData = re.findall(r'[0-9]+',outData[0]) 
       outData = int(outData[0]) 
       print("[Probe = nco_p_mttrapd] and PID = ",outData) 
      except TimeoutError: 
       outData = -1 
       pass 
      if outData > 0: 
       ftp_client = ssh_client.open_sftp() 
       localfilepath1 = r"/tmp/Python_361/rules.tar" 
       remotefilepath1 = r"/tmp/rules.tar" 
       ftp_client.put(localfilepath1,remotefilepath1) 
       ftp_client.close() 
       stdin, stdout, stderr = ssh_client.exec_command('sudo su - root') 
       stdin.write("\n") 
       stdin.flush() 
       stdin, stdout, stderr = ssh_client.exec_command("whoami") 
       print(stdout.readlines()) 
      elif outData == -1: 
       print("Host is unreachable - Please contact your network administrtor, nothing to do") 
      else: 
       print("mttrapd probe is not running on this host, nothing to do") 

    file.close() 

出力

Welcome on-board ... 
Please choose from following 
1 - Global Update 
2 - Specific Update 
Please input as 1 or 2 :2 
Please provide 'IPADDRESS' of Specific Remote Client :x.x.x.x 
Trying to connect - x.x.x.x 
[Probe = nco_p_mttrapd] and PID = 12345 
['$user\n'] 
Trying to connect - x.x.x.x 
[Probe = nco_p_mttrapd] and PID = 12345 
**['$user\n'] #--------> I need this to be ['root\n']** 
+1

コマンドを実行して終了します続行する。おそらくhttps://stackoverflow.com/questions/37586811/pass-commands-as-input-to-another-command-su-ssh-sh-etc – tripleee

+0

を参照してください。* sudo su - sudo su - root * ?任意のエラー? –

+0

スクリプト(私の場合はリモート)からsudo su - rootを実行すると、rootとしてコマンドを実行できません。最初にsudo su - rootを実行した後、同じスクリプトからwhoamiを実行し、whoamiへの出力がルートになることを期待するスクリプトがあると考えてください。しかし、私の場合、whoamiは私に$ userを与え、rootではないことを問題にしています。これが説明したいと思っています... –

答えて

1

を次のようにIVEがあり、これは動作しません:

基本的にcomamndsを次のように同じである
stdin, stdout, stderr = ssh_client.exec_command('sudo su - root') 
stdin, stdout, stderr = ssh_client.exec_command("whoami") 

[local-host] # ssh [email protected] sudo su - root 
[local-host] # ssh [email protected] whoami 

代わりに、あなたは次のように書く必要があります。

stdin, stdout, stderr = ssh_client.exec_command('sudo su - root') 
stdin.write('whoami\n') 
# Here stdout.readlines() would not work as it would keep reading 
# until EOF (which means the `sudo` comamnd has exited). 
print(stdout.channel.recv(1024)) 
関連する問題