Ruby and Net :: SSH와 함께 첫 명령 전에 SSH 프롬프트에 응답하십시오.
문제
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에서 여러 채널을 열 수 있습니다. 어쩌면 서버는 첫 번째 기본 채널에만 응답하고 다른 채널을 열면 신선한 쉘이됩니다.