我的要求如下:
我必须使用我的凭据登录Unix框,登录后,我必须对不同的用户做sudo.一旦sudo成功,我必须在nohup中调用 shell.完成执行后,关闭通道和会话.
我必须使用我的凭据登录Unix框,登录后,我必须对不同的用户做sudo.一旦sudo成功,我必须在nohup中调用 shell.完成执行后,关闭通道和会话.
我尝试了使用sudo命令连接的第一步,但我不知道如何在sudo命令之后调用shell脚本.
在下面的代码中,我能够执行sudo命令,但在获得sudo访问权限后,如何在用户masteruser中执行nohup中的shell.因此创建所需的文件我的shell将所有者作为masteruser.
public class SSHUploader { Session session = null; public SSHUploader(){ } public void connect(){ try { JSch jsch = new JSch(); session = jsch.getSession("user","xxx.xxx.xx.xx",22); session.setPassword("test"); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking","no"); session.setConfig(config); session.connect(); } catch (Exception ex) { ex.printStackTrace(); } } public void executeCommand(String script) throws JSchException,IOException{ System.out.println("Execute sudo"); String sudo_pass = "test"; ChannelExec channel = (ChannelExec) session.openChannel("exec"); ((ChannelExec) channel).setCommand( script); InputStream in = channel.getInputStream(); OutputStream out = channel.getOutputStream(); ((ChannelExec) channel).setErrStream(System.err); channel.connect(); out.write((sudo_pass + "\n").getBytes()); out.flush(); byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp,1024); if (i < 0) break; System.out.print(new String(tmp,i)); } if (channel.isClosed()) { System.out.println("exit-status: " + channel.getExitStatus()); break; } try { Thread.sleep(1000); } catch (Exception ee) { System.out.println(ee); } } channel.disconnect(); System.out.println("Sudo disconnect"); } public void disconnect(){ session.disconnect(); } public static void main(String... args) throws JSchException,IOException { SSHUploader up = new SSHUploader(); up.connect(); up.executeCommand("sudo -u masteruser bash"); up.disconnect(); } }
解决方法
要按顺序执行多个命令,可以创建如下命令字符串:
String script ="pbrun su - user; cd /home/scripts;./sample_script.sh”
执行它并将此字符串传递给上面的方法.