Java Jsch sudo作为用户并执行脚本
我使用jsch登录到远程主机,以不同的用户身份执行脚本。 必须使用“exec”频道。 我当前执行的unix操作是: 1) sudo su- 2) 运行脚本 如何运行此命令“sudo su-”,然后在同一通道中执行脚本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&
更新了代码注释,我正在尝试发送以下两个命令作为输入。它在循环中运行,我看不到它正在被执行。以下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,则不会提示输入密码。是的,您正在编写。好的,因此使用中建议的第二种方法。”