2016-06-16 5 views
-1

最終サーバにファイルをアップロードする必要があり、そのファイルを入力として使用してコマンドを実行する必要があります。localhost上のPythonスクリプトを使用してjumpserverからfinalserverにファイル(scp)とrunコマンドを転送する

実行される(しかし、私はステップ3で立ち往生しています)全体の行動のためのステップになります次のとおりです。

1 - (SCPを使用)jumpserverするローカルホストからの転送ファイル

2 - SSH jumpserverへ

3 - (SCPを使用)finalserverするjumpserverから転送ファイルは

4 -

5 finalserverへのSSH - COを実行(入力ファイルとしてファイルに)finalserver上mmand

try: 
    cmd_str = "scp " + file_path + " " + user + "@" + jumpbox + ":/tmp/" 
    print "---------local to jumpbox initiated:" 
    #print cmd_str 

    child = pexpect.spawn(cmd_str) #-------------------------------------------------------step 1 
    child.expect("password:") 
    #pwd = raw_input("please enter password along with yubikey:") 
    pwd = getpass.getpass("Enter password along with yubikey:") 
    child.sendline(pwd) 
    i = child.expect(['Permission denied', filename]) 
    if i==0: 
     print "Permission denied on host. Can't login" 
     pwd = getpass.getpass("Enter password along with yubikey:") 
     child.sendline(pwd) 
     #child.kill(0) 
    elif i==1: 
     print "file successfully transferred to jumpbox" 

     #----SSHing into jumpbox 
     ssh_jump_cmd = "ssh " + user + "@" + jumpbox 
     print ssh_jump_cmd 
     ssh_child = pexpect.spawn(ssh_jump_cmd) #-------------------------------------------------------step 2 
     ssh_child.expect("password:") 
     pwd2 = getpass.getpass("Enter password along with yubikey:") 
     ssh_child.sendline(pwd2) 
     i2 = ssh_child.expect(['Permission denied', '[#\$]']) 
     if i2 == 0: 
      print "Permission denied on host. Can't login. Try again" 
      pwd2 = getpass.getpass("Enter password along with yubikey:") 
      ssh_child.sendline(pwd2) 
     elif i2 == 1: 
      print "--------------Inside Jumpbox:" 

      #sending file from jumpbox to finalserver 
      ba_cmd = "scp /tmp/"+ filename + " " + cmd_var + ":/tmp/" 
      print ba_cmd 
      ba_child = pexpect.spawn(ba_cmd) #-------------------------------------------------------step 3 
      ba_child.expect("Enter passphrase for key:") 
      phrase = getpass.getpass("Enter passphrase: ") 
      ba_child.sendline(phrase) 
      print "Password should be asked:" 
      i3 = ba_child.expect(['Enter passphrase for key', 'Permission denied', filename]) 
      if i3 == 0: 
       phrase = getpass.getpass("Enter passphrase: ") 
       ba_child.sendline(phrase) 
      elif i3 == 1: 
       print "Lost connection:" 
       ba_child.kill(0) 
      elif i3 == 2: 
       ssh_ba_cmd = "ssh " + smba 
       ba_ssh_child = pexpect.spawn(ssh_ba_cmd) #-------------------------------------------------------step 4 
       ba_ssh_child.expect("Enter passphrase for key: ") 
       phrase = getpass.getpass("Enter passphrase: ") 
       ba_ssh_child.sendline(phrase) 
       i4 = ba_ssh_child.expect(['Permission denied', '[#\$]']) 
       if i4 == 0: 
        print "Passphrase incorrect. Exiting" 
        ba_ssh_child.kill(0) 

       elif i4 == 1: 
        final_cmd = "ls -l" + filename #- just an example for this question 
        final_child = pexpect.spawn(final_cmd) 
        print "********************" 
        print sys.stdout 

私は、Python Pexpectを使用して子供を生むとjumpserverするSSHingまで成功しました。スクリプトがfinalserverするjumpserverからSCPしようとすると、次のエラーが生成されます:

scp /tmp/filename finalserver:/tmp/ 
End Of File (EOF). Exception style platform. 
<pexpect.spawn object at 0x7efddfdad650> 
version: 3.1 
command: /usr/bin/scp 
args: ['/usr/bin/scp', 'filename', 'finalserver:/tmp/'] 
searcher: <pexpect.searcher_re object at 0x7efddfdad5d0> 
buffer (last 100 chars): '' 
before (last 100 chars): 'ssh: Could not resolve hostname finalserver: Name or service not known\r\r\nlost connection\r\n' 
after: <class 'pexpect.EOF'> 
match: None 
match_index: None 
exitstatus: 1 
flag_eof: True 
pid: 7244 
child_fd: 5 
closed: False 
timeout: 30 
delimiter: <class 'pexpect.EOF'> 
logfile: None 
logfile_read: None 
logfile_send: None 
maxread: 2000 
ignorecase: False 
searchwindowsize: None 
delaybeforesend: 0.05 
delayafterclose: 0.1 
delayafterterminate: 0.1 

を私はhttp://stackoverflow.com/questions/17913540/python-ssh-in-to-a-jumpserver-and-then-ssh-in-to-a-host-from-the-jumpserver-to-eて行きましたが、まだ助けを必要としています。

TIA。

+0

のようなものは、エラーメッセージがかなり明確で、それはないですか? 'finalserver'という名前は解決しません。 – tripleee

+0

Jumpserverはfinalserverが何であるかを知っていますが、localhostからスクリプトを実行しているときにfinalserverを解決できません。私は立ち往生している場所があります。どのように進める? – v1h5

+0

なぜローカルでコマンドを生成していますか? jumpserverの子供にそれを与える。 – tripleee

答えて

0

私は、サーバー間でファイルを転送し、paramikoでコマンドを実行し、ちょうどあなたが新しいローカル子を産卵している例で

import paramiko 
local_path = "foo/bar" 
remote_path = "bar/foo" 
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect("remote_url", username='username') 
sftp = ssh.open_sftp() 
ssh.exec_command('mkdir -p '+ remote_path) 
sftp.put(local_path, remote_path) 
+0

時間を割いてコメントをいただきありがとうございます。私はParamikoを試してみたいですが、私の質問は解決しました。私が間違っていたのはちょっと微妙な調整だった。 :-) – v1h5

1
> ba_child = pexpect.spawn(ba_cmd) 

を見てお勧めします。代わりに、scpコマンドをjumpserverのシェルを実行しているssh_childに送信する必要があります。

ここに構文上のぶれが、

ssh_child.sendline(ba_cmd) 
+0

wohoa ...私はこれについて考えなかった。 * facepalm *。 私はこれを試してみましょう、これは問題を解決する必要があります。 私はすぐにこれを試しています。 – v1h5

+0

魅力的な作品です。間違いを指摘してくれてありがとう。 非常に感謝しています。 :) – v1h5

関連する問題