gpt4 book ai didi

java - "Sudo su - weblogic"通过 Java 程序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:43 28 4
gpt4 key购买 nike

我正在尝试连接我的远程 unix 机器并使用 java 程序执行一些 ssh 命令。

connection = new Connection(hostname);                                                  
connection.connect();
boolean isAuthenticated = connection.authenticateWithPassword(username, password);
if (isAuthenticated == false)
throw new IOException("Authentication failed.");
Session session = connection.openSession();
session.execCommand("sudo su - weblogic");

这里又需要密码& ofcrs,我不能提供,因为没有终端。因此在我的 unix 用户主目录 (/home/..../bharat) 中创建了一个 user.sh 文件,内容如下。

echo <mypassword> | sudo -S su - weblogic
sudo -S su - weblogic

但现在如果我像下面这样调用 bash user.sh

session.execCommand("bash user.sh"); 

用我的用户在 java 中登录后,出现以下错误并且还无法找出解决方法。

sudo: sorry, you must have a tty to run sudo
sudo: sorry, you must have a tty to run sudo

请帮忙:)

发送响应("cd/u02/app/oracle/xyz/admin/domains/11.1.1.9/xxxx_xx_xxx_xxx.domain/shared/logs/xxxx");在下面 -

突出显示的红色 ==> 显示响应,我现在收到了。

突出显示蓝色 ==> 预期响应。

突出显示的绿色 ==> 如果我通过拆分同一命令发送 4 个较小的命令,则工作正常。

enter image description here

最佳答案

正如您和@rkosegi 所说,su 需要一个终端 session 来获取密码。

看起来像示例中的 Ganymed SSH-2 库?这有一个 shell session 选项。显然,您现在需要直接通过 stdout 和 stdin 处理读取和写入。

例如,有几种方法可以使其更简单:

public class SshTerminal {
private Connection connection;
private Session session;

private Reader reader;
private PrintWriter writer;
private String lastResponse;

public SshTerminal(String hostname, String username, String password)
throws JSchException, IOException {
connection = new Connection(hostname);
connection.connect();
boolean isAuthenticated = connection.authenticateWithPassword(username,
password);
if (isAuthenticated == false)
throw new IOException("Authentication failed.");
session = connection.openSession();
session.requestDumbPTY();
session.startShell();

writer = new PrintWriter(session.getStdin());
reader = new InputStreamReader(session.getStdout());
}

public void send(String command) {
writer.print(command + "\n");
writer.flush();
}

public void waitFor(String expected) throws IOException {
StringBuilder buf = new StringBuilder();
char[] chars = new char[256];
while (buf.indexOf(expected) < 0) {
int length = reader.read(chars);
System.out.print(new String(chars, 0, length));
buf.append(chars, 0, length);
}

int echoEnd = buf.indexOf("\n");
int nextPrompt = buf.lastIndexOf("\n");
if (nextPrompt > echoEnd)
lastResponse = buf.substring(echoEnd + 1, nextPrompt);
else
lastResponse = "";
}

public String getLastResponse() {
return lastResponse;
}

public void disconnect() {
session.close();
connection.close();
}
}

然后这工作正常:

    SshTerminal term = new SshTerminal(host, username, password);

term.waitFor("$ ");
term.send("su -");
term.waitFor("Password: ");
term.send(rootPassword);
term.waitFor("# ");
term.send("ls /root");
term.waitFor("# ");
term.send("cat /file-not-found 2>&1");
term.waitFor("# ");

term.send("cat /var/log/messages");
term.waitFor("# ");
String logFileContent = term.getLastResponse();

term.send("exit");
term.waitFor("$ ");
term.send("exit");

term.disconnect();

String[] lines = logFileContent.split("\n");
for (int i = 0; i < lines.length; i++)
logger.info("Line {} out of {}: {}", i + 1, lines.length, lines[i]);

这包括解析响应中的行并强制通过错误输出的示例。

显然,在您的环境中,某些响应可能会有所不同。

关于java - "Sudo su - weblogic"通过 Java 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50757608/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com