关闭

通过Runtime.getRuntime().exec使用Linux脚本

标签: RunTimeexec
4834人阅读 评论(0) 收藏 举报
分类:
很多时候开发者非常方便地在shell命令窗口使用的命令行进行一些查看操作文件操作修改权限等,也希望能够在程序中直接使用相关的命令直接操作系统;

于是Java提供了一个这样的接口RunTime;

Runtime
Class Overview
--------------------------------------------------------------------------------
Allows Java applications to interface with the environment in which they are running. Applications can not create an instance of this class, but they can get a singleton instance by invoking getRuntime().

大概就是提供了一个Java操作底层操作系统的接口

修改时间的测试程序:


MainActivity.java

public class MainActivity extends Activity {

	private Context mContext;
	private Button btnShowTime;
	private Button btnSetTime;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContext = this;
		btnSetTime = (Button) findViewById(R.id.button1);
		btnSetTime.setText("Set To : 2015-11-20 12:12:12");
		findViewById(R.id.button1).setOnClickListener(
				new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						SetTime("2015-11-20 12:12:12");
					}
				});
		btnShowTime = (Button) findViewById(R.id.btnShowTime);
		findViewById(R.id.btnShowTime).setOnClickListener(
				new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						Calendar cal = Calendar.getInstance();
						btnShowTime.setText(cal.get(Calendar.YEAR)+"-");
						btnShowTime.append(cal.get(Calendar.MONTH)+"-");
						btnShowTime.append(cal.get(Calendar.DAY_OF_MONTH)+" ");
						btnShowTime.append(cal.get(Calendar.HOUR_OF_DAY)+":");
						btnShowTime.append(cal.get(Calendar.MINUTE)+":");
						btnShowTime.append(cal.get(Calendar.SECOND)+"");
					}
				});
	}
	
	public void SetTime(String datetime) {
		try {
			String time = datetime.replaceAll("-", "");
			time = time.replaceAll(" ", ".");
			time = time.replaceAll(":", "");
			Process process = Runtime.getRuntime().exec("su");
			DataOutputStream os = new DataOutputStream(
					process.getOutputStream());
			os.writeBytes("setprop persist.sys.timezone GMT\n");
			//	os.writeBytes("/system/bin/date -s " + time + "\n");// 效果一样
			os.writeBytes("date -s " + time + "\n");
			os.writeBytes("clock -w\n");
			os.writeBytes("exit\n");
			os.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

程序中使用的replace是把时间格式化为: 20151120.121212 ;

关于最后时间为2015-10-20,原因是月份是从0开始算的,而其他年,日,时分秒都是符合日常习惯的;

修改权限:

private void changePermission(String filePath) {
	String command = "chmod 777 " + filePath;
	Process process = null;
	DataOutputStream os = null;
	try {
		process = Runtime.getRuntime().exec("su");
		os = new DataOutputStream(process.getOutputStream());
		os.writeBytes(command + "\n");
		os.writeBytes("exit\n");
		os.flush();
	} catch (Exception e) {
		e.printStackTrace();
	}
}


在AndroidManifest.xml中不需要配置任何权限;但是前提是系统已经ROOT了;

部分我们常用的一些命令:

1 重启系统:reoot

2 修改文件权限:chmod 777 system/test;  chmod 777 system/test/abc.txt  ;

3 删除文件及文件夹:rm test.txt ; rmdir test; rm -rf * ; 

4 输入返回键:input keyevent 4 ;

5 以太网开启/关闭:ifconfig eth0 down; ifconfig eth0 up; 


以下为个人看法不经核实望纠正:

RunTime是在一个独立的进程Process中执行

所以以下两种情况是不一样的:

方法一:

Runtime runtime = Runtime.getRuntime();  
Process proc = runtime.exec("su");  
runtime.exec("cmd1");  
runtime.exec("cmd2");  

方法二:

Process proc = runtime.exec("su");  
DataOutputStream os = new DataOutputStream(proc.getOutputStream());  
os.writeBytes("cmd1\n");  
os.writeBytes("cmd2\n");  
os.writeBytes("exit\n");  
os.flush();  

以上两种方法中

第一种方法中su,cmd1和cmd2分别在不同的进程中进行,所以cmd1和cmd2没有得到ROOT权限(出现permission denied)。

而第二种方法中cmd1和cmd2在同一个进程中进行,而该进程一开始拥有了ROOT权限,所以cmd1和cmd2就是ROOT权限执行。




2
0
查看评论

java使用Runtime.exec执行linux命令

转自: http://huajianhsiu.iteye.com/blog/1772775 使用sh -c  , 不然会报 can not  create Process  error =2的错误! 一、Runtime.getRuntime().e...
  • cloudeagle_bupt
  • cloudeagle_bupt
  • 2013-12-03 16:18
  • 6514

调用Runtime.getRuntime().exec()执行Linux脚本防挂死和返回脚本输出

调用Runtime.getRuntime().exec()执行Linux脚本防挂死和返回脚本输出
  • NMS312
  • NMS312
  • 2014-09-04 13:18
  • 5578

通过Runtime.getRuntime().exec使用Linux脚本

很多时候开发者非常方便地在shell命令窗口使用的命令行进行一些查看操作文件操作修改权限等,也希望能够在程序中直接使用相关的命令直接操作系统; 于是Java提供了一个这样的接口RunTime; Runtime Class Overview --------------------------...
  • dreamInTheWorld
  • dreamInTheWorld
  • 2015-11-20 16:33
  • 4834

Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本

Android Runtime使得直接调用底层Linux下的可执行程序或脚本成为可能比如Linux下写个测试工具,直接编译后apk中通过Runtime来调用或者写个脚本,apk中直接调用,省去中间层或者JNI这个至少效率应该比较高吧代码:public class test extends Activ...
  • zmyde2010
  • zmyde2010
  • 2011-01-08 11:45
  • 47574

Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本

Android Runtime使得直接调用底层Linux下的可执行程序或脚本成为可能 比如Linux下写个测试工具,直接编译后apk中通过Runtime来调用 或者写个脚本,apk中直接调用,省去中间层或者JNI 这个至少效率应该比较高吧 代码: [java] vi...
  • w6028819321
  • w6028819321
  • 2013-08-08 19:24
  • 2738

Runtime.exec()执行linux shell

<br /> <br />最好的执行系统命令的方法就是写个bat文件或是shell脚本。然后调用,那样修改和实现就简点多了。<br /> <br />现在执行外部命令,主要的方式,还是通过调用所以平台的SHELL去完成,WINDOW...
  • HEYUTAO007
  • HEYUTAO007
  • 2010-06-30 20:43
  • 17348

windows下通过Runtime.getRuntime().exec.()执行linuxshell脚本

windows下通过Runtime.getRuntime().exec.()执行linuxshell脚本 开源中国 发表于 2014-08-26 19:48:12 执行Runtime.getRuntime().exec("ps -ef|grep i...
  • xiaoxiaoniaoge
  • xiaoxiaoniaoge
  • 2015-09-16 21:43
  • 2120

关于Runtime.getRuntime().exec 进程会一直被挂起,一直在等待的原因。

为了方面广大程序员,我还是决定将改bug写在我的博客上。 在网上查找到的关于Runtime.getRuntime().exec执行命令的方法首先出现的的是这个: try { Process process = Runtime.getRuntime().exec("su"...
  • u013266076
  • u013266076
  • 2015-07-04 14:26
  • 2526

Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现

前言日常java开发中,有时需要通过java运行其它应用功程序,比如shell命令等。jdk的Runtime类提供了这样的方法。首先来看Runtime类的文档, 从文档中可以看出,每个java程序只会有一个Runtime实例,显然这是一个单例模式。/** * Every Java applicat...
  • yiduyangyi
  • yiduyangyi
  • 2017-04-20 16:07
  • 2593

通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本

原文地址  http://blog.csdn.net/zmyde2010/article/details/6123987 Android Runtime使得直接调用底层Linux下的可执行程序或脚本成为可能 比如Linux下写个测试工具,直接编译后apk中通过Run...
  • u011819464
  • u011819464
  • 2014-07-07 14:03
  • 430
    个人资料
    • 访问:164513次
    • 积分:2695
    • 等级:
    • 排名:第15888名
    • 原创:104篇
    • 转载:17篇
    • 译文:1篇
    • 评论:43条
    我的链接