SSH connection via soapui

Добрый день, 

подскажите как (и возможно ли вообще) в soapui коннектиться к удаленному серверу? Например, для просмотра файлов.

Спасибо!

 

 

хм никогда не задавался такой задаей

я так понимаю, Вы хотите подконнектиться к ssh через groovy ?

ну или использую груви или может есть какие-то другие способы. главное надо осуществлять определеные действия на сервере с файлами.

Я делал через консоль Linux-a и работал с потоками ввода/вывода. Другого пути я не нашел. Настраиваем автоконнект с помощью пары ключей, или используем sshpass - доп. ПО для передачи пароля в консоль. Другого выхода я не нашел.

Если вам нужно оперировать только файлами, то можно конечно поднять там Samba и использовать в Groovy стандартный класс File (работа без аутентификации) или Smb пакет (работа с аутентификацией). Решать Вам, конечно, но работа ч/з консоль и потоками довольно сложная, так как отслеживать нудно все 3!!! стандартных потока (Input, output, error), ну и писать довольно сложный обработчик/парсер. Имхо проще Samba настроить. Но в моём случае нужно было управлять daemon-ами и запускать файлы на удаленной машине, поэтому только консоль, но повторюсь, всё довольно непросто, тем более стоит учитывать что в SoapUI не крайняя версия Groovy.

ja ispolzuu groovy step to run ssh command.

tak vigljadit moi groovy step:

def command = 'ls -lrt'
def scriptsLocation =  context.expand('${projectRoot}' ) + '/scripts/'
//SSHCommandExecutor  sshCommandExecutor = new SSHCommandExecutor()
SSHCommandExecutor sshCommandExecutor =  context.getProperty("sshCommandExecutor")
def result = sshCommandExecutor.executeCommand(command, scriptsLocation)

log.info result

chtoby execute etot script v moem sluchae:

  1. dobav’te etot file jsch-0.1.51.jar into soapUIRoot/lib
  2. in the script location u menya est’ takoi class
  3. I properties file otkuda postupaut ssh credentials

import java.io.InputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;


import groovy.util.logging.Log

@Log
class SSHCommandExecutor {

	def Session session = null;
	def sshHost = null;
	def sshUser = null;
	def sshPassword = null;
	def configFile = "config.properties"
	def response = ''
	boolean autoCloseSession = true
	
	def executeCommand(command, scriptsLocation) {
		try{
			if(session == null){
				initializeSSHProperties(scriptsLocation)
			}
			Channel channel=session.openChannel("exec")
			((ChannelExec)channel).setCommand(command)
			channel.setInputStream(null)
			((ChannelExec)channel).setErrStream(System.err)

			InputStream inputStream = channel.getInputStream()
			channel.connect()
			byte[] tmp=new byte[1024]
			response = ''
			while(true){
				while(inputStream.available()>0){
					int i=inputStream.read(tmp, 0, 1024)
					if(i<0)break
					log.info "" + new String(tmp, 0, i)
					response = response+new String(tmp, 0, i)
				}
				if(channel.isClosed()){
					log.info "exit-status: " + channel.getExitStatus()
					break
				}
				try{
					Thread.sleep(1000)
				}catch(Exception ee){
				}
			}
			channel.disconnect()
			if(autoCloseSession){
				closeSession()
			}
			log.info "DONE";
			return response;
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	def executeCommandsFromFile(scriptsLocation, filePath) {
		if(session == null){
			initializeSSHProperties(scriptsLocation)
		}
		def oldAutoCloseSession = autoCloseSession
		autoCloseSession = false
		
		def scriptFile = new File(filePath)
		def finalResult = ''
		scriptFile.eachLine { line ->
			log.info '>' + line 
			def result = executeCommand(line, scriptsLocation)
			System.out.println  result
			finalResult = finalResult + result
		}
		
		if(oldAutoCloseSession){
			closeSession()
		}
		
		autoCloseSession = oldAutoCloseSession
		return finalResult
		
	}
	
	def executeCommands(scriptsLocation,String commandLines, String separator) {
		if(session == null){
			initializeSSHProperties(scriptsLocation)
		}
		def oldAutoCloseSession = autoCloseSession
		autoCloseSession = false
		
		String [] commnads = commandLines.split(separator)
		def finalResult = ''
		for(String command: commnads){
			finalResult = finalResult + executeCommand(command, scriptsLocation)
		}
		
		if(oldAutoCloseSession){
			closeSession()
		}
		
		autoCloseSession = oldAutoCloseSession
		return finalResult
		
	}

	def executeStartMVPServer(scriptsLocation) {

		try{
			def restartCommand = "~/arf/fileToRun.sh"
			if(session == null){
				initializeSSHProperties(scriptsLocation)
			}

			Channel channel=session.openChannel("exec");
			((ChannelExec)channel).setCommand(restartCommand);
			channel.setInputStream(null);
			((ChannelExec)channel).setErrStream(System.err);

			InputStream inputStream = channel.getInputStream();
			channel.connect();
			byte[] tmp=new byte[1024];
			response = '';
			while(true){
				while(inputStream.available()>0){
					int i=inputStream.read(tmp, 0, 1024);
					if(i<0)break;
					log.info "" + new String(tmp, 0, i);
					response = response+new String(tmp, 0, i);
				}
				if(channel.isClosed()){
					log.info "exit-status: " + channel.getExitStatus();
					break;
				}
				try{
					Thread.sleep(1000);
				}catch(Exception ee){
				}
			}
			channel.disconnect();
			if(autoCloseSession){
				closeSession()
			}
			log.info "DONE";
			return response;
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	def executeStopMVPServer(scriptsLocation) {

		try{
			def restartCommand = "~/arf/fileToRun.sh"
			if(session == null){
				initializeSSHProperties(scriptsLocation)
			}

			Channel channel=session.openChannel("exec");
			((ChannelExec)channel).setCommand(restartCommand);
			channel.setInputStream(null);
			((ChannelExec)channel).setErrStream(System.err);

			InputStream inputStream = channel.getInputStream();
			channel.connect();
			byte[] tmp=new byte[1024];
			response = '';
			while(true){
				while(inputStream.available()>0){
					int i=inputStream.read(tmp, 0, 1024);
					if(i<0)break;
					log.info "" + new String(tmp, 0, i);
					response = response+new String(tmp, 0, i);
				}
				if(channel.isClosed()){
					log.info "exit-status: " + channel.getExitStatus();
					break;
				}
				try{
					Thread.sleep(1000);
				}catch(Exception ee){
				}
			}
			channel.disconnect();
			if(autoCloseSession){
				closeSession()
			}
			log.info "DONE";
			return response;
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	def executeRestartMVPServer(scriptsLocation) {

		try{
			def restartCommand = "~/arf/mmeRestartForGroovy.sh"
			initializeSSHProperties(scriptsLocation);

			Channel channel=session.openChannel("exec");
			((ChannelExec)channel).setCommand(restartCommand);
			channel.setInputStream(null);
			((ChannelExec)channel).setErrStream(System.err);

			InputStream inputStream = channel.getInputStream();
			channel.connect();
			byte[] tmp=new byte[1024];
			response = '';
			while(true){
				while(inputStream.available()>0){
					int i=inputStream.read(tmp, 0, 1024);
					if(i<0)break;
					log.info "" + new String(tmp, 0, i);
					response = response+new String(tmp, 0, i);
				}
				if(channel.isClosed()){
					log.info "exit-status: " + channel.getExitStatus();
					break;
				}
				try{
					Thread.sleep(1000);
				}catch(Exception ee){
				}
			}
			channel.disconnect();
			if(autoCloseSession){
				closeSession()
			}
			log.info "DONE";
			return response;
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	def createSession() {
		try{
			java.util.Properties config = new java.util.Properties();
			config.put("StrictHostKeyChecking", "no");
			JSch jsch = new JSch();
			Session session=jsch.getSession(sshUser, sshHost, 22);
			session.setPassword(sshPassword);
			session.setConfig(config);
			session.connect();
			log.info("Connected");
			return session;
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	def initializeSSHProperties(scriptsLocation){
		log.info "Initializing SSH properties"
		Properties properties = new Properties()
		File propertiesFile = new File(scriptsLocation + '/' + configFile)
		propertiesFile.withInputStream {
			properties.load(it)
		}
		sshHost = properties["sshHost"]
		sshUser = properties["sshUser"]
		sshPassword = properties["sshPassword"]
		log.info "sshHost=" + sshHost
		log.info "sshUser=" + sshUser
		log.info "sshPassword=" + sshPassword
		session = createSession()
		log.info "Initialized SSH properties";
	}
	
	
	def closeSession(){
		session.disconnect()
		session = null
		log.info 'Session Closed'
	}
	
}

Внимательно читаем FAQ по форматированию кода.