有这样一个需求,通过socket请求别人的服务器获取他们的服务器时间,然后需要用这个时间来修改自己服务器的时间。
想到的就是使用Java里面的:
Process Runtime.getRuntime.exec(String command);
这命令来执行一个Linux Shell脚本,关于此命令的使用大家可以去网上查查看。
然后是修改Linux系统时间的脚本命名为setDate.sh,如下:
#!/bin/bash
# we have less than 2 arguments. Print the help text:
if [ $# == 2 ];then
echo "input date is:" $1 ",time is:" $2
date -s "$1 $2"
fi
把此脚本放到服务器上,通过Java去掉用:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class LinuxTimeSetter {
public void runLinuxScript() throws IOException {
//通过exec 来运行Linux shell脚本:在这个demo中 setDate.sh 是和 LinuxTimeSetter 在同一个文件夹中
String[] command = new String[]{"sudo","./setDate.sh","2010-10-10","12:12:12"};
Process proc = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String text = null;
//输出操作结果
while ((text = br.readLine()) != null) {
System.out.println(text);
}
}
public static void main(String[] args) {
String osName = System.getProperty("os.name").toLowerCase();
System.out.println(osName);
LinuxTimeSetter runner = new LinuxTimeSetter();
try {
runner.runLinuxScript();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果你用的是root用户,那么应该是能成功的,但如果不是root用户是不会成功的,因为普通用户账户下,是无法成功设置Linux系统的时间。
因此你需要切换到root账户,使用visudo编辑sudoers配置文件(网上有sudo具体使用方法)
例如我们用的普通用户:test/test
用hostname获取当前主机名:linux.localdomain
root ALL=(ALL) ALL
test linux.localdomain=(ALL) NOPASSWD: /home/test/demo/setDate.sh
#第一行:允许root用户使用sudo命令变成系统中任何其它类型的用户
#第二行: 格式:用户或组 主机【ALL/本机名】 = (权限【ALL/root】) 命令,就本例来说,它是用户test。此外,因为系统中的组和用户可以重名,要想指定该规则的适用对象是组而非用户的话,组对象的名称一定要用百分号%开头。
切换到test用户中:su - etoken,运行sudo ./setDate.sh 2017-07-16 21:01:22,使用date命令检查Linux时间是否成功修改。如果成功,就说明配置成功了。那么Java LinuxTimeSetter,也会成功了。
参考: