Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jsch sudo作为用户并执行脚本_Java_Unix_Sudo_Jsch - Fatal编程技术网

Java Jsch sudo作为用户并执行脚本

Java Jsch sudo作为用户并执行脚本,java,unix,sudo,jsch,Java,Unix,Sudo,Jsch,我使用jsch登录到远程主机,以不同的用户身份执行脚本。 必须使用“exec”频道。 我当前执行的unix操作是: 1) sudo su- 2) 运行脚本 如何运行此命令“sudo su-”,然后在同一通道中执行脚本 更新了代码注释,我正在尝试发送以下两个命令作为输入。它在循环中运行,我看不到它正在被执行。以下tw是在数组列表“命令”中发送的输入 sudo su-testusr /home/testusr/start.sh ChannelShell channel = null; List&

我使用jsch登录到远程主机,以不同的用户身份执行脚本。 必须使用“exec”频道。 我当前执行的unix操作是: 1) sudo su- 2) 运行脚本

如何运行此命令“sudo su-”,然后在同一通道中执行脚本


更新了代码注释,我正在尝试发送以下两个命令作为输入。它在循环中运行,我看不到它正在被执行。以下tw是在数组列表“命令”中发送的输入 sudo su-testusr /home/testusr/start.sh

ChannelShell channel = null;

List<String> result = new ArrayList<String>();
InputStream inStream = null;
OutputStream outStream = null;

PipedOutputStream pOutStream = null;
PipedInputStream pInStream = null;
try {
    inStream = new PipedInputStream();
    pOutStream = new PipedOutputStream((PipedInputStream) inStream);

    outStream = new PipedOutputStream();
    pInStream = new PipedInputStream((PipedOutputStream) outStream);
    channel = (ChannelShell) session.openChannel("shell");
    // channel.setPty(true);
    channel.setInputStream(inStream);
    channel.setOutputStream(outStream);
    channel.connect();
    BufferedReader bfs = null;

    for (String command : commands) {
        LOGGER.info("Executing command {} ", command);
        pOutStream.write((command.concat("\n")).getBytes());
    }
    LOGGER.info(" exit status {}", channel.getExitStatus());
    bfs = new BufferedReader(new InputStreamReader((inStream)));
    if (channel.getExitStatus() != 0) {

        result.add("ERROR");
    }
    String line;
    byte[] bt = new byte[1024];
    while (true) {
        while (inStream.available() > 0) {
            int i = inStream.read(bt, 0, 1024);
            if (i < 0) {
                break;
            }
            LOGGER.info("result {}", new String(bt, 0, i));
        }
        if (channel.isClosed()) {
            LOGGER.info("exit status {}", channel.getExitStatus());
            break;
        }
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
ChannelShell channel=null;
列表结果=新建ArrayList();
InputStream inStream=null;
OutputStream outStream=null;
PipedOutputStream-pOutStream=null;
PipedInputStream pInStream=null;
试一试{
inStream=新管道InputStream();
pOutStream=新管道输出流((管道输出流)流入);
outStream=新管道输出流();
pInStream=新的PipedInputStream((PipedOutStream)外流);
channel=(ChannelShell)session.openChannel(“shell”);
//通道设置(真);
通道设置输入流(流内);
通道设置输出流(外流);
channel.connect();
BufferedReader bfs=null;
用于(字符串命令:命令){
info(“正在执行命令{}”,command);
write((command.concat(“\n”)).getBytes();
}
info(“退出状态{}”,channel.getExitStatus());
bfs=新的BufferedReader(新的InputStreamReader((流内));
if(channel.getExitStatus()!=0){
结果。添加(“错误”);
}
弦线;
字节[]bt=新字节[1024];
while(true){
while(inStream.available()>0){
int i=流内读取(bt,0,1024);
if(i<0){
打破
}
info(“result{}”,新字符串(bt,0,i));
}
if(channel.isClosed()){
info(“退出状态{}”,channel.getExitStatus());
打破
}
试一试{
睡眠(1000);
}捕获(例外e){
e、 printStackTrace();
}
}

第二次编辑

for (String command : commands) {
                OutputStream out = channel.getOutputStream();
                out.write((command.concat("\n")).getBytes());
                out.flush();
                InputStream in = channel.getInputStream();
                byte[] tmp = new byte[1024];
                while (true) {
                    while (in.available() > 0) {
                        int i = in.read(tmp, 0, 1024);
                        if (i < 0) {
                            break;
                        }
                        LOGGER.info("Output stream execution {}", new String(
                                tmp, 0, i));
                    }
                    if (channel.isClosed()) {
                        LOGGER.info("Executing exit status {}",
                                channel.getExitStatus());
                        break;
                    }
                }
            }
for(字符串命令:命令){
OutputStream out=channel.getOutputStream();
out.write((command.concat(“\n”)).getBytes();
out.flush();
InputStream in=channel.getInputStream();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
if(i<0){
打破
}
info(“输出流执行{}”,新字符串(
tmp,0,i);
}
if(channel.isClosed()){
info(“正在执行退出状态{}”,
channel.getExitStatus());
打破
}
}
}

你真的需要做sudo su-? 如果您的脚本是bash脚本,您可以调用
sudobash-your_-script.sh

这适用于任何更改解释器的脚本类型


su-
还原用户环境,如果您确实需要它,您的脚本可以源于
~/.bash_profile
例如。

根据此建议。((ChannelExec)channel).setCommand(“sudo-S-p”+”命令);我如何才能通过以用户身份运行,在会话中我将以登录用户身份运行,现在我已经切换了sudo su-staryes,在使用jsch执行之前在putty terminal中尝试了相同的操作,如下所示,但它会在putty terminal中提示输入密码,因此使用jsch也会出现相同的行为。“sudo su-c/home/testusr/rn.sh-testusrsu-testusr。这会提示输入密码。这些尝试来自putty终端,我没有使用jsch进行测试。在putty终端中,如果我使用sudo su-testusr,则不会提示输入密码。是的,您正在编写。好的,因此使用中建议的第二种方法。”