使用 JSch 的多个命令
Posted
技术标签:
【中文标题】使用 JSch 的多个命令【英文标题】:Multiple commands using JSch 【发布时间】:2013-06-25 12:31:44 【问题描述】:我的要求如下: 我必须使用我的凭据登录到 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, 0, 1024);
if (i < 0)
break;
System.out.print(new String(tmp, 0, 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();
【问题讨论】:
How to perform multiple operations with JSch的可能重复 【参考方案1】:为了按顺序执行多个命令,您可以创建一个命令字符串,如下所示:
String script ="pbrun su - user; cd /home/scripts;./sample_script.sh”
执行它并将这个字符串传递给你上面的方法。
【讨论】:
另外,添加“echo Running script_X; ./script_X”似乎很适合使用多个命令。 请注意,这是 *nix shell 特定的解决方案 - 它既不是 SSH 也不是 JSch 功能 - 所以在其他系统(如 Windows)上,可能需要不同的语法。 +1 我遇到了这种类型的实现问题。相反,我创建了 2 个通道而不是 1 个(这里我有 2 个命令要运行)【参考方案2】:这篇文章可能很旧,但我找到了另一种简单的方法,可以让您分别检索每个命令的输出。请注意,此代码必须在会话打开后执行,如示例 (http://www.jcraft.com/jsch/examples/Exec.java.html) 所示:
for (String command : commands)
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setInputStream(null);
channel.setErrStream(System.err);
channel.setCommand(command);
channel.connect();
printOutput(channel);
channel.disconnect();
其中printOutput
使用channel.getInputStream()
读取命令的结果。
【讨论】:
以上是关于使用 JSch 的多个命令的主要内容,如果未能解决你的问题,请参考以下文章