Ruby and Net :: SSH와 함께 첫 명령 전에 SSH 프롬프트에 응답하십시오.

StackOverflow https://stackoverflow.com/questions/2223194

  •  19-09-2019
  •  | 
  •  

문제

net :: ssh를 사용하여 로그인 직후에 사용자의 입력이 필요한 스크립트를 실행하는 서버에 연결하려고합니다. 사용자는 "1"또는 "2"를 입력해야하며 나중에 터미널에서 일부 데이터를 수신합니다.

내 문제는 연결할 수는 있지만 "1 n"을 서버로 보내고 출력을받는 방법을 찾을 수 없다는 것입니다.

다음 코드는 "info -net.ssh.connection.session [80906b74] : channel_open_confirmation : 0 0 32768"에서 중지됩니다.

채널 대신 채널을 사용하여 채널을 사용하는 것은 의심 할 여지없이 작동하지 않습니다.

Net::SSH.start('host', 'user', :password => "pass", :auth_methods => ["password"], :verbose => :debug) do |session|

  session.open_channel do |channel|

    channel.on_data do |ch, data|
      STDOUT.print data
    end 

    channel.send_data( "1\n")

  end

  session.loop
end    

어떤 아이디어, 누구입니까?

미리 감사드립니다

도움이 되었습니까?

해결책

당신은 당신의 것을 확인할 수 있습니까? send_data 전화가 일어나고 있습니다 ~ 후에 원격 서버에서 프롬프트를 얻습니까? a channel.on_data 당신 주위의 차단 send_data 응답을 보내기 전에 서버에서 예상 프롬프트를 받는지 확인할 수 있도록 전화하십시오.

사용하고 싶지 않을 수도 있습니다 exec 여기. net :: ssh :: connection :: 채널의 문서에서 :

주어진 명령을 호출하도록 요청하는 채널 요청을 보냅니다.

명령을 호출하지 않고 프롬프트에 응답하기 위해 텍스트 문자열을 보내고 싶을 것입니다. 문서 쇼 exec "ls -l /home"과 같은 전체 CLI 명령을 보내는 데 사용됩니다.

대신에, send_data 아마 당신이 원하는 것일 것입니다. 문서는 channel.send_data("the password\n"). 그러나이 문장은 문서에서 다음과 같습니다.

채널을 통해 즉시 데이터를 전송하지 않고 대신 주어진 데이터를 채널의 출력 버퍼에 추가하여 다음 다음에 연결이 데이터를 수락 할 때 포장 및 발송을 준비합니다.

당신은보고 싶을 수도 있습니다 channel.request_pty. 콘솔 기반 애플리케이션과의 상호 작용을 위해 설계된 것으로 보입니다.

(본질적으로) 일반적으로 수동으로 수행하는 SSH 세션을 스크립트하려는 경우 expect-같은 인터페이스 (예 : 보석과 같은 sshexpect 시도해 볼 가치가있을 수 있습니다).

다른 팁

포인터에 감사드립니다. channel.request_pty를 사용하는 것 외에도 쉘을 요청해야했습니다. 다음은 마지막으로 예상대로 작동합니다.

Net::SSH.start('host', 'user', :password => "pass", :auth_methods => ["password"]) do |session|

  session.open_channel do |channel|

    channel.request_pty do |ch, success| 
      raise "Error requesting pty" unless success 

      ch.send_channel_request("shell") do |ch, success| 
        raise "Error opening shell" unless success  
      end  
    end

    channel.on_data do |ch, data|
      STDOUT.print data
    end 

    channel.on_extended_data do |ch, type, data|
      STDOUT.print "Error: #{data}\n"
    end

    channel.send_data( "1\n" )

    session.loop
  end  
end    

나는 Net :: ssh libs에 대해 굉장히 익숙하지 않으므로 그 자격을 도울 수는 없지만 사용하고 싶은 것을 달성 할 수있는 것처럼 들립니다. Capistrano.

예를 들어 원격 서버에 연결하는 Capistrano 작업이 있으며 입력을 기대 한 다음 계속하는 명령을 실행합니다. Capistrano는 원격 I/O를 처리합니다. 어쩌면 그것은 당신을위한 해결책 일 수 있습니까?

도움이되기를 바랍니다!

내가 실행하면 "1\n" 쉘에서 내가받는 답장은 다음과 같습니다. bash: 1: command not found

내가 실행하면 echo "1" 나는 얻다: 1

보내는 텍스트를 실행하려고 하시겠습니까? 어쩌면 당신은 다음과 같은 것을 찾고 있었을 것입니다.

output = ""
Net::SSH.start('host', 'user', :password => "pass") do |ssh|
   output = ssh.exec! "echo 1"
end
puts output

나는 그 lib에 능숙하지 않지만 SSH에서 여러 채널을 열 수 있습니다. 어쩌면 서버는 첫 번째 기본 채널에만 응답하고 다른 채널을 열면 신선한 쉘이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top