2015-08-03 4 views
0

Я написал простую программу groovy, которая использует Jsch Library для создания туннеля ssh и открытия оболочки на целевом сервере. Сценарий прекрасно соединяется и открывается оболочка. В IntelliJ я могу ввести ввод в оболочку и получить последующий вывод, если я запустил программу. Однако, если я попытаюсь сделать то же самое в терминале или в cmd, он подключится нормально, но я не могу ввести какой-либо вход, поэтому не могу запускать команды.Jsch Shell не принимает ввод от терминала

println "Opening connection to ${sshUser}@${sshHost}:${sshPort}" 
Properties config = new Properties() 
config.put("StrictHostKeyChecking", "no") 
JSch jsch = new JSch() 

Session sshSession = jsch.getSession(sshUser, sshHost, sshPort as int) 
sshSession.setPassword(sshPass) 
sshSession.setConfig(config) 
sshSession.connect() 
println "Connected" 


println "Forwarding connection to ${targetHost}:${targetPort}" 
def assignedPort = sshSession.setPortForwardingL(0, targetHost, targetPort as int) 
println "Got port $assignedPort" 

// Set the session to open as a Shell 
Channel channel = targetSession.openChannel("shell") 
// Set Input and Output streams 
channel.setInputStream(System.in) 
channel.setOutputStream(System.out); 
// Connect 
channel.connect() 

UPDATE

После дальнейшего чтения, кажется, чтобы получить эту работу есть хак для строки Windows. Однако код, который JCraft при условии, имеет целый ряд вопросов, которые я борюсь с:

channel.setInputStream(new FilterInputStream(System.in){ 
     public int read(byte[] b, int off, int len)throws IOException{ 
     return in.read(b, off, (len>1024?1024:len)); 
     } 
    }); 

я получаю очень полезную ошибку «соврет»

+0

Я предполагаю, что вы хотите сделать это в отдельном потоке –

+0

Да вот что я надеялся, to – joey7492

+0

Попробуйте вызвать 'channel.setPty (true)' перед вызовом 'connect()'. Вы можете открыть необработанную трубу в удаленной системе, которая не реагирует на нажатия клавиш так, как вы ожидаете. Если это не поможет, пожалуйста, подробно опишите, как вы тестируете подключение к удаленной системе. – Kenster

ответ

0

Я нашел решение очень просто в конце концов , Подскажите хак для Windows делает работу, но должен быть изменен следующим образом:

return System.in.read(b, off, (len>1024?1024:len)); 

Спасибо за вашу помощь во всяком случае, ребята

Смежные вопросы