/etc/passwd默认SHELL被修改后,没法登陆的处理办法 java
系统环境:AIX6.1 64bit shell
操做:修改root用户的默认shell ->ksh,使用bash作为默认登陆shell 数据库
修改时顺带把普通用户的shell也改为了bash bash
问题:/etc/passwd文件修改为功,但没有安装bash,结果可想而知,全部用户不能正常登陆。 服务器
错误:没法使用任何方式登陆aix,ftp、ssh、sftp、scp、telnet不能登陆。 oracle
这种状况己经没法进行远程管理,对系统的维护将无从下手,而惟一的处理办法就是经过机房重启系统,并在启动时用维护模式进行修改,把root的/usr/bin/bash改回默认的/usr/bin/ksh app
可是,该服务器在运行着数据库服务,业务要求不能间断,意味着你不能为所欲为的进行重启单用户维护,那么如今的状况很糟糕: ssh
1.不能用任何方式登陆对系统进行维护 测试
2.保证该服务器正在运行的数据库不能中断业务 优化
3.要修复/etc/passwd必须重启
在这种状况下,只能经过其它手段来修改/etc/passwd文件,把不存在的bash /usr/bin/bash改成默认的/usr/bin/ksh,这样以来保证能够登陆,其次再去安装bash进行系统优化。
在深刻分析并测试后发现有如下几个方面值得关注:
1.运行数据库服务的是oracle用户
2.数据库服务运行正常,能够进行任何数据库操做
3.数据库能够写内部JAVA过程
4.JAVA能够操做文件,固然也能够执行系统命令。
5.JAVA将继承运行它的用户属主的权限,能够任意修改oracle的目录及文件。
6. su -s /usr/bin/ksh root 命令可使用指定的shell进行登陆,而忽略/etc/passwd指定的shell
7.AIX系统中有expect
8.AIX系统中有perl
9.root和oracle用户的登陆口令都没有改动。
经过以上条件,汇总整理一条能够得到root权限来修改/etc/passwd的流程,以下:
change_passwd.sh脚本得到root权限,并调用perl修改/etc/passwd文件
change_passwd.sh脚本:
要生成change_passwd.sh,须要在JAVA里输入各行内容,在写入时须要注意转义。
须要的权限有:
1.root 权限
2.数据库权限
须要的role:
connect,resource
3.java操做文件权限
call dbms_java.grant_permission( 'SYSTEM', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' );
call dbms_java.grant_permission('SYSTEM','java.io.FilePermission','<<ALL FILES>>','read,write');
即便SYSTEM用户也须要执行上述受权才行,要否则没法进行文件处理。
下面编写的2个JAVA过程
java_create_expect用于创建change_passwd.sh文件
java_exec_expect用于执行chang_passwd.sh文件
********************************************************************* create or replace and compile java source named java_create_expect as import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class Javacreateexpect { public static void main(String[] args) { FileOutputStream out = null; FileOutputStream outSTr = null; BufferedOutputStream Buff = null; FileWriter fw = null; try { /* 创建/home/oracle/change_passwd.sh脚本文件 */ byte[] str1 = "#!/usr/bin/expect\n".getBytes(); byte[] str2 = "spawn /usr/bin/su -s /usr/bin/ksh root\n".getBytes(); byte[] str3 = "expect \"Password:\";\n".getBytes(); byte[] str4 = "send \"cdr12345\\n\";\n".getBytes(); byte[] str5 = "expect \"#\";\n".getBytes(); // byte[] str6 = "send \"/usr/bin/cp -f /etc/passwd /home/oracle/\\n";\n".getBytes(); byte[] str6 = "send \"/usr/bin/cp -f /etc/passwd /home/oracle/\\n\"\n".getBytes(); byte[] str7 = "send \"/usr/bin/perl -p -i -e s,:/usr/bin/bash,:/usr/bin/ksh, /home/oracle/passwd\\n\"\n".getBytes(); byte[] str8 = "send \"/usr/bin/cat /home/oracle/passwd\\n\"\n".getBytes(); byte[] str9 = "send \"/usr/bin/mv /etc/passwd /etc/passwd.bak_20121123\\n\"\n".getBytes(); byte[] str10 = "send \"/usr/bin/cp /home/oracle/passwd /etc/passwd\\n\"\n".getBytes(); byte[] str11= "send \"exit\\n\";\n".getBytes(); byte[] str12 = "expect eof".getBytes(); out = new FileOutputStream(new File("/home/oracle/change_passwd.sh")); long begin = System.currentTimeMillis(); out.write(str1); out.write(str2); out.write(str3); out.write(str4); out.write(str5); out.write(str6); out.write(str7); out.write(str8); out.write(str9); out.write(str10); out.write(str11); out.write(str12); out.close(); //System.out.println("hello,world"); /* 修改change_passwd.sh文件属性,添加可执行权限 */ String cmd = "chmod +x /home/oracle/change_passwd.sh"; Process p = Runtime.getRuntime().exec(cmd); /* System.out.println("hello,earth");*/ /*显示change_oracle.sh文件内容 */ /*String cmd_disp_expect = "cat /home/oracle/ep.sh"; p = Runtime.getRuntime().exec(cmd_disp_expect); is = p.getInputStream(); br = new java.io.BufferedReader(new java.io.InputStreamReader(is)); sb = new StringBuffer(); do { sb.setLength(0); String str = br.readLine(); if (str == null) break; if (str.trim().equals("")) continue; sb.append(str); System.out.println(sb.toString()); } while (true); */ } catch (Exception e) { e.printStackTrace(); } } }
********************************************************************* create or replace and compile java source named java_exec_expect as import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.lang.Thread; import java.lang.Object; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; public class Javaexecexpect { public static void main(String[] args) { FileOutputStream out = null; FileOutputStream outSTr = null; BufferedOutputStream Buff = null; FileWriter fw = null; try { String cmd_exec_expect = "/usr/bin/expect -f /home/oracle/change_passwd.sh"; Process p = Runtime.getRuntime().exec(cmd_exec_expect); // 得到返回值 java.io.InputStream stdin = p.getInputStream(); java.io.InputStreamReader isr = new java.io.InputStreamReader(stdin); java.io.BufferedReader br = new java.io.BufferedReader(isr); StringBuffer sb = new StringBuffer(); do { sb.setLength(0); String str = br.readLine(); if (str == null) break; if (str.trim().equals("")) continue; sb.append(str); System.out.println(sb.toString()); // System.err.println(loadStream(p.getErrorStream())); } while (true); /*Thread.sleep(1000);*/ int exitVal = p.waitFor(); System.out.println("Process exitValue: " + exitVal); } catch (Exception e) { System.err.println("System Monitor Error" + e.toString()); e.printStackTrace(); } } }
********************************************************************* /* 用procedure引用java */ create or replace procedure p_java_create_expect(vv in varchar2) as language java name 'Javacreateexpect.main(java.lang.String[])'; create or replace procedure p_java_exec_expect(vv in varchar2) as language java name 'Javaexecexpect.main(java.lang.String[])'; /* 按顺序执行这2个过程 */ set serverout on; call dbms_java.set_output(5000); exec p_java_create_expect (''); set serverout on; call dbms_java.set_output(5000); exec p_java_exec_expect (''); /*执行完成后,用SSH客户端登陆进行测试 */
至此,用oracle对root系统配置文件的修改操做成功。
转载CU上的讨论帖,附件本站下载地址:http://www.oschina.net/action/code/download?code=16402&id=27052