[英]Executing multiple commands over SSH "exec" channel on firewall device with Java JSch does not work
[英]Executing sudo using SSH "exec" channel in JSch
我正在使用我在其中传递以下命令的文件:
hostname
pwd
pbrun su - fclaim
whoami
cd ..
pwd
在下面添加 Java 代码:
for (String command1 : commands) {
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command1);
in=channel.getInputStream();
channel.connect();
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)
break;
System.out.println(new String(tmp, 0, i));
}
if(channel.isClosed()){
break;
}
}
channel.setInputStream(null);
channel.disconnect();
}
但我得到这个输出:
/home/imam
imam
/home/imam
您的代码在隔离环境中执行每个命令。 所以你的第二个whoami
不会像你希望的那样在pbrun su
运行。
pbrun su
执行一个新的 shell。
要向 shell 提供命令,您可以:
在su
命令行上指定命令,如官方 JSch Sudo.java
示例所示:
((ChannelExec)channel).setCommand("pbrun su - fclaim -c whoami");
或使用其标准输入将命令提供给 shell:
OutputStream out = channel.getOutputStream(); out.write(("whoami\\n").getBytes());
也可以看看:
在 sudo 登录后使用 Java JSch 程序执行多个 bash 命令并
sudo login 后运行命令。
一般来说,我推荐第一种方法,因为它使用更好定义的 API(命令行参数)。
我遇到了类似的问题,并在@Martin
帮助下解决了这个问题,通过 SO 链接进行了大量的研发和扫描。 这是对我有用的程序。
public class SSHConn {
static Session session;
static String suCmds = "su - simba -c \"whoami ; pwd\"";
static String[] commands = {"whoami", suCmds};
public static void main(String[] args) throws Exception {
open();
runCmd(commands);
close();
}
public static void runCmd(String[] commands) throws JSchException, IOException {
for (String cmd : commands) {
System.out.println("\nExecuting command: " + cmd);
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(cmd);
InputStream in = channel.getInputStream();
OutputStream out = channel.getOutputStream();
channel.connect();
//passing creds only when you switch user
if (cmd.startsWith("su -")) {
System.out.println("Setting suPasswd now....");
out.write((Constants.suPasswd + "\n").getBytes());
out.flush();
System.out.println("Flushed suPasswd to cli...");
}
captureCmdOutput(in, channel);
channel.setInputStream(null);
channel.disconnect();
}
}
public static void captureCmdOutput(InputStream in, Channel channel) throws IOException {
System.out.println("Capturing cmdOutput now...");
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()) {
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
System.out.println(ee.getMessage());
}
}
}
public static void open() throws JSchException {
JSch jSch = new JSch();
session = jSch.getSession(Constants.userId, Constants.host, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(Constants.userPasswd);
System.out.println("Connecting SSH to " + Constants.host + " - Please wait for few seconds... ");
session.connect();
System.out.println("Connected!\n");
}
public static void close() {
session.disconnect();
System.out.println("\nDisconnected channel and session");
}
}
输出:
Connecting SSH to my-unix-box.net - Please wait for few seconds...
Connected!
Executing command: whoami
Capturing cmdOutput now...
john
Executing command: su - simba -c "whoami ; pwd"
Setting suPasswd now....
Flushed suPasswd to cli...
Capturing cmdOutput now...
simba
/home/simba
Disconnected channel and session
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.