我正在做一个项目,我需要编译一个C程序,在测试数据上运行它,然后生成它的输出。我使用两个bash脚本,第一个clearscript.sh从当前目录(code.c,输入,输出)中删除temprory文件,myscript.sh编译code.c,在输入文件上运行它并生成我显示的输出在我的GUI文本区域。
现在我的问题是,如何阻止用户执行诸如执行系统(“rm *”)之类的事情,因为这会做很糟糕的事情。一种方法是我可以搜索对应于系统命令的字符串,如果找到,那么我将不允许程序运行。但我觉得必须有一个更好的解决方案来停止通过C程序执行外部程序。
另一个问题是当程序运行无限循环时程序停止响应。而且我觉得还有很多问题我将在后面发现。是否有更好的方法来完成我的程序正在做的事情。
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.awt.event.*;
class test2 {
static JTextArea ta1,ta2,ta0;
public static class myEvent implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
try{
Process p = new ProcessBuilder("./cleanscript.sh").start();
p.waitFor();
}
catch(Exception e1)
{}
try{
BufferedWriter bw = new BufferedWriter(new FileWriter("code.c"));
ta1.write(bw);
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
try{
BufferedWriter bw = new BufferedWriter(new FileWriter("input"));
ta0.write(bw);
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
try{
Process pb = new ProcessBuilder("./myscript.sh").start();
pb.waitFor();
}
catch(Exception t)
{}
try {
ta2.read(new FileReader(new File("output")),"fun");
}
catch (IOException ioe2)
{
ioe2.printStackTrace();
}
}
}
public static void main(String args[]) {
JFrame jf;
jf = new JFrame();
jf.setLocationByPlatform(true);
ta0 = new JTextArea("Give Input to the program here,before running the program");
ta1 = new JTextArea("Your C program here",0,100);
ta2 = new JTextArea("Your output will be shown here");
ta2.setEditable(false);
JScrollPane jsp0,jsp1,jsp2;
jsp0 = new JScrollPane(ta0);
jsp1 = new JScrollPane(ta1);
jsp2 = new JScrollPane(ta2);
jf.getContentPane().setLayout(new GridLayout(4,1));
jf.getContentPane().add(jsp1);
jf.getContentPane().add(jsp0);
jf.getContentPane().add(jsp2);
JButton jb = new JButton("Run");
jb.addActionListener(new myEvent());
jf.getContentPane().add(jb);
jf.setSize(1000,400);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}}
cleanscript.sh的代码
rm code.c
rm input
rm output
myscript.sh的代码
cc code.c
./a.out < input > output
答案 0 :(得分:2)
如果您需要运行某些外部程序,请设置允许的程序列表,并检查列表中的内容。 不要使用system(3)
,它调用shell来运行命令(这很容易傻瓜),使用exec(3)
系列之一。有关安全性的注意事项的更多细节是here。