sftp 无权限问题修复

This commit is contained in:
even 2025-07-06 16:20:33 +08:00
parent 558f4d346d
commit 7a2fa73974
8 changed files with 138 additions and 9 deletions

View File

@ -13,6 +13,7 @@ public class ShuiMuUrlConstant {
public static final String getProjectVersion = "/api/project/code/getProjectVersion";
public static final String buildAndSaveConfig = "/api/driverGeneration/buildAndSaveConfig";
public static final String getProjectById = "/api/project/";
public static final String getProjectResource = "/api/project/getProjectResource";
public static final String uploadWfuzzJson = "/api/project/code/uploadWfuzzJson";
public static final String executeAllEntrypointsTest ="/api/driverGeneration/executeAllEntrypointsTest";
}

View File

@ -0,0 +1,16 @@
package cd.casic.ci.process.dto.resp.shuimu;
import lombok.Data;
@Data
public class ShuiMuProjectResourceResp {
private Integer projectId;
private Integer workspaceResource;
private Integer buildResource;
private Integer testResource;
private Integer queueResource;
private Integer finishResource;
private Integer problemCount;
private Double coverage;
}

View File

@ -1,12 +1,14 @@
package cd.casic.ci.process.engine.worker.shuimu;
import cd.casic.ci.process.common.WorkAtom;
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp;
import cd.casic.ci.process.engine.constant.ShuiMuConstant;
import cd.casic.ci.process.engine.runContext.TaskRunContext;
import cd.casic.ci.process.engine.worker.base.BaseWorker;
import cd.casic.ci.process.engine.worker.base.SshWorker;
import cd.casic.ci.process.process.dataObject.task.PipTask;
import cd.casic.ci.process.process.service.shuimu.ShuiMuService;
import com.alibaba.fastjson.JSON;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@ -27,5 +29,15 @@ public class ShuiMuWorker extends BaseWorker {
String projectId = (String)taskProperties.get(ShuiMuConstant.SHUI_MU_PROJECT_ID_KEY);
Integer fuzzMinutes = Integer.parseInt(String.valueOf(taskProperties.get(ShuiMuConstant.SHUI_MU_FUZZ_MINUTES)));
shuiMuService.executeAllEntrypointsTest(projectId,fuzzMinutes);
append(context,"水木模糊测试开始执行");
while (true){
ShuiMuProjectResourceResp projectResource = shuiMuService.getProjectResource(projectId);
append(context,"当前执行情况:");
append(context, JSON.toJSONString(projectResource));
if (projectResource.getTestResource()==0) {
append(context,"水木模糊测试执行完毕");
break;
}
}
}
}

View File

@ -4,6 +4,7 @@ import cd.casic.ci.process.dto.req.shuimu.ShuiMuBuildAndSaveReq;
import cd.casic.ci.process.dto.req.shuimu.ShuiMuProjectCreateReq;
import cd.casic.ci.process.dto.req.shuimu.ShuiMuUpdateWFuzzJsonReq;
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectInfoResp;
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp;
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectVersionResp;
import java.util.List;
@ -30,4 +31,5 @@ public interface ShuiMuService {
void buildAndSaveConfig(ShuiMuBuildAndSaveReq req);
void uploadWfuzzJson(ShuiMuUpdateWFuzzJsonReq req);
void executeAllEntrypointsTest(String projectId,Integer fuzzMinutes);
ShuiMuProjectResourceResp getProjectResource (String projectId);
}

View File

@ -4,6 +4,7 @@ import cd.casic.ci.process.dto.req.shuimu.ShuiMuBuildAndSaveReq;
import cd.casic.ci.process.dto.req.shuimu.ShuiMuProjectCreateReq;
import cd.casic.ci.process.dto.req.shuimu.ShuiMuUpdateWFuzzJsonReq;
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectInfoResp;
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp;
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectVersionResp;
import cd.casic.ci.process.dto.resp.shuimu.ShuiMuTokenResp;
import cd.casic.ci.process.engine.manager.RunContextManager;
@ -31,6 +32,8 @@ import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;
import static cd.casic.ci.process.constant.ShuiMuUrlConstant.*;
@ -191,7 +194,9 @@ public class ShuiMuServiceImpl implements ShuiMuService {
body.add("projectId",req.getProjectId());
body.add("env",req.getEnv());
body.add("fileName",req.getFileName());
HttpEntity<MultiValueMap<String,String>> entity = new HttpEntity<>(body,getHeaders());
HttpHeaders headers = getHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String,String>> entity = new HttpEntity<>(body, headers);
ResponseEntity<String> exchange = restTemplate.exchange(shuiMuProperties.getBaseUrl() + buildAndSaveConfig, HttpMethod.POST, entity, String.class, new HashMap<>());
if (exchange.getStatusCode().isError()) {
throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"保存并且构建失败");
@ -207,16 +212,23 @@ public class ShuiMuServiceImpl implements ShuiMuService {
restReq.put("product",projectInfo.getProduct());
restReq.put("language",projectInfo.getLanguage());
restReq.put("build",req.getBuild());
ByteArrayOutputStream bis = new ByteArrayOutputStream();
String tempDir = System.getProperty("java.io.tmpdir");
File tempFile = new File(tempDir,"wfuzz.json");
try {
ObjectOutputStream oos =new ObjectOutputStream(bis);
oos.writeObject(restReq);
File tempFile = File.createTempFile(UUID.randomUUID().toString().replaceAll("-", ""), "");
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(JSON.toJSONString(restReq).getBytes());
fos.flush();
tempFile.setReadable(true,false);
FileSystemResource resource = new FileSystemResource(tempFile);
MultiValueMap<String,Object> body = new LinkedMultiValueMap<>();
body.add("projectId",req.getProjectId());
body.add("file",resource);
HttpEntity<MultiValueMap<String,Object>> entity = new HttpEntity<>(body,getHeaders());
HttpHeaders headers = getHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String,Object>> entity = new HttpEntity<>(body, headers);
ResponseEntity<String> exchange = restTemplate.exchange(shuiMuProperties.getBaseUrl() + uploadWfuzzJson, HttpMethod.POST, entity, String.class, new HashMap<>());
if (exchange.getStatusCode().isError()) {
throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"更新配置文件失败");
@ -230,6 +242,8 @@ public class ShuiMuServiceImpl implements ShuiMuService {
ShuiMuProjectVersionResp.Repo repo = projectVersion.getRepo();
ShuiMuBuildAndSaveReq shuiMuBuildAndSaveReq = new ShuiMuBuildAndSaveReq();
BeanUtils.copyProperties(repo,shuiMuBuildAndSaveReq);
shuiMuBuildAndSaveReq.setProjectId(req.getProjectId());
shuiMuBuildAndSaveReq.setFileName(repo.getFilename());
buildAndSaveConfig(shuiMuBuildAndSaveReq);
}
@ -247,7 +261,24 @@ public class ShuiMuServiceImpl implements ShuiMuService {
}
}
@Override
public ShuiMuProjectResourceResp getProjectResource (String projectId) {
HttpEntity<String> entity = new HttpEntity<>(null,getHeaders());
String uriString = UriComponentsBuilder.fromUriString(shuiMuProperties.getBaseUrl() + getProjectResource ).queryParam("projectId",projectId)
.toUriString();
ResponseEntity<String> exchange = restTemplate.exchange(uriString, HttpMethod.GET, entity, String.class, new HashMap<>());
if (exchange.getStatusCode().isError()) {
throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"获取项目执行信息失败");
}
String data = JSON.parseObject(exchange.getBody()).getString("data");
try {
List<ShuiMuProjectResourceResp> shuiMuProjectResourceResps = JSONArray.parseArray(data, ShuiMuProjectResourceResp.class);
return shuiMuProjectResourceResps.get(0);
} catch (Exception e){
return null;
}
}
private HttpHeaders getHeaders(){
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);

View File

@ -7,6 +7,7 @@ import com.amazonaws.util.IOUtils;
import com.jcraft.jsch.*;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
@ -14,7 +15,7 @@ import java.io.*;
import java.util.*;
import static com.fhs.common.utils.StringUtil.trim;
@Slf4j
public class SftpUploadUtil {
private static final int DEFAULT_SFTP_PORT = 22;
@ -584,8 +585,10 @@ public class SftpUploadUtil {
// 获取远程文件名和目录
String remoteDir = remoteFilePath.substring(0, remoteFilePath.lastIndexOf('/'));
String fileName = remoteFilePath.substring(remoteFilePath.lastIndexOf('/') + 1);
String chmodDir = remoteFilePath.substring(0, remoteFilePath.indexOf("default"));
log.info("分配权限路径,{}",chmodDir);
// 切换目录并列出内容用于调试
sudoChmodORwx(session,chmodDir,password);
try {
channelSftp.cd(remoteDir);
} catch (SftpException e) {
@ -1471,7 +1474,41 @@ public class SftpUploadUtil {
}
public static void sudoChmodORwx(Session session, String remotePath, String sudoPassword) throws Exception {
String command = "sudo -S chmod -R o+rwx " + remotePath;
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setCommand(command);
OutputStream out = channelExec.getOutputStream();
InputStream in = channelExec.getInputStream();
channelExec.setErrStream(System.err);
channelExec.connect();
// 写入sudo密码
out.write((sudoPassword + "\n").getBytes());
out.flush();
// 读取命令输出
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 等待命令执行完成
while (!channelExec.isClosed()) {
Thread.sleep(100);
}
int exitStatus = channelExec.getExitStatus();
channelExec.disconnect();
if (exitStatus != 0) {
throw new RuntimeException("sudo chmod 执行失败,退出码: " + exitStatus);
} else {
System.out.println("sudo chmod -R o+rwx 执行成功!");
}
}
private static boolean thisDirectory(ChannelSftp channelSftp, String fullPath) {
try {
SftpATTRS attrs = channelSftp.lstat(fullPath);

View File

@ -2,10 +2,19 @@ package cd.casic.server;
import cd.casic.ci.process.engine.manager.LoggerManager;
import jakarta.annotation.Resource;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpResponse;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
@SpringBootTest(classes = {OpsServerApplication.class})
@ActiveProfiles("local")
public class SSETest {
@ -15,5 +24,22 @@ public class SSETest {
public void subscribe(){
loggerManager.subscribe("716299524330622976",null);
}
@Test
public void shuimuSSE() throws IOException {
try (CloseableHttpClient client = HttpClients.createDefault()) {
HttpGet request = new HttpGet("http://175.6.27.155:10200/api/driverGeneration/progress?uuid=6");
request.addHeader("Accept", "text/event-stream");
request.addHeader("Authorization", "Bearer xj76K1VJBMrKnCXAzTdPJUCp4B4");
try (CloseableHttpResponse response = client.execute(request)) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("收到: " + line);
}
}
}
}
}

View File

@ -37,7 +37,7 @@ public class SftpTest {
}
@Test
public void ssh(){
System.out.println(CryptogramUtil.doDecrypt("cf917c4ff8463a54df75120e2ff802e8"));
System.out.println(CryptogramUtil.doDecrypt("b44a50e0cfb98f81c8c003330780c835923c2e5caa1738d61e27ee541be54e2e"));
}
@Test
public void getFileList(){
@ -68,4 +68,8 @@ public class SftpTest {
e.printStackTrace();
}
}
@Test
public void test00(){
System.out.println("{\"code\":0,\"message\":\"OK\",\"data\":\"锟斤拷\\u0000\\u0005t\\u0000锟絳\\\"product\\\":\\\"code\\\",\\\"build\\\":\\\"{\\\\\\\"helper\\\\\\\":\\\\\\\"jar-analyzer\\\\\\\",\\\\\\\"config\\\\\\\":{\\\\\\\"root\\\\\\\":\\\\\\\"./test-1.0.jar\\\\\\\"}}\\\",\\\"project\\\":\\\"搴旂敤妫€娴媉76ce2c9dab224d8cbc79821bcc85b61b\\\",\\\"language\\\":\\\"java\\\"}\"}");
}
}