精华内容
下载资源
问答
  • 使用proc文件系统和内核交互

    千次阅读 2012-05-14 09:15:58
    《使用proc文件系统和内核交互》 本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整。 参考资料:IBM developerWorks 《使用/proc文件系统来访问Linux内核的内容》、...
    《使用proc文件系统和内核交互》
    
    本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性。
    参考资料:IBM developerWorks 《使用/proc文件系统来访问Linux内核的内容》、Linux-2.6.10内核
    来源:http://blog.csdn.net/rosetta/article/details/7563610

        此篇是在《内核模块编写》和《字符设备驱动程序编写基础》基础上写的,但这篇也是基础文章。使用proc文件系统与内核数据交互和之前写的《字符设备驱动程序编写基础》原理非常相似,只不过前者使用的是内核提供给/proc文件系统的一组专用函数,所以本节主要介绍如何使用这组函数,具体原理学习可参考给出的链接。
        可能大家都使用过cat /proc/cpuinfo(meminfo)来查看系统cpu或内存信息,或者也注意到在/proc目录中存在所有以ps -ef进程号为命令的目录,在所有对应的进程号目录中都有许多和该进程相关的文件,具体是些什么文件我不能用最确切的语言来描述或者定义,但我可以肯定的一点是这些文件应该都是由内核里反馈出来的,比如进入某个文件夹,可以cat 对应的status、maps、limits来看看到底包含什么。
        下面首先例出这组函数,再给出一个例子。
    一、相关函数和结构体
      1,struct proc_dir_entry *proc_mkdir(const char *name,
            struct proc_dir_entry *parent)//在parent目录创建一个名为name的目录。
       比如:struct proc_dir_entry *proc_net_ipsec_dir = proc_mkdir("ipsec", proc_net);//在proc_net目录创建名为ipsec的目录
      其中proc_net相当于宏,指/proc/net目录,如果第二个参数传NULL,即指默认/proc目录。以下是几个类似的宏。
        proc_root_fs /proc
        proc_net /proc/net
        proc_bus /proc/bus
        proc_root_driver /proc/driver
      2,再继续第二个函数之前有必要先说下porc_mkdir的返回值,它是一个结构体struct pro_dir_entry
      struct proc_dir_entry {
        unsigned int low_ino;
        unsigned short namelen;
        const char *name;
        mode_t mode;
        nlink_t nlink;
        uid_t uid;
        gid_t gid;       
        unsigned long size;
        struct inode_operations * proc_iops;
        struct file_operations * proc_fops;
        get_info_t *get_info;
        struct module *owner;
        struct proc_dir_entry *next, *parent, *subdir;
        void *data;
        read_proc_t *read_proc;
        write_proc_t *write_proc;
        atomic_t count;     /* use count */
        int deleted;        /* delete flag */
      };
      里面包含了一个文件(Linux把所有对象都当文件看代,目录当然也是一个文件)所有属性,比如:文件名、权限、uid、gid、前一级目录、包含的子目录等等,我记得在APUE2e在讲解文件系统时讲到过,所以可以结合上面内容进行理解。
      这次我们不对这些属性感兴趣,主要是关注下目录的读写函数,即read_proc和write_proc,一会例子中会提到。
      3,struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
                         struct proc_dir_entry *parent)//在parent目录创建一个名为name,权限为mode的文件。
        比如:struct proc_dir_entry * item = create_proc_entry("klipsdebug", 0400, "/proc/ipsec")//在/proc/ipsec目录创建一个权限为0400(只读)的文件klipsdebug
      4,create_proc_entry执行后返回的proc_dir_entry可以自己指定read、write等函数,如果只需要read函数,可以使用
        static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
        mode_t mode, struct proc_dir_entry *base,
        read_proc_t *read_proc, void * data)
        它其实是对create_proc_entry进行了封装,把create_proc_read_entry的传入值read_proc赋给了create_proc_entry返回值的read_proc成员,具体可看内核实现。
      5,struct proc_dir_entry *proc_symlink( const char *name,
                                           struct proc_dir_entry *parent,
                                           const char *dest );//在parent目录创建指定dest目录的名为name的符号链接。
      比如: proc_symlink("ipsec_eroute", proc_net, "ipsec/eroute/all");//在/proc/net创建指向/proc/net/ipsec/eroute/all的符号链接ipsec_eroute。
      6,void remove_proc_entry( const char *name, struct proc_dir_entry *parent );//删除parent目录中的名为name的文件
      7,还有两上函数比较重要,就是之前提到的read、write函数中需要调用的函数,这两个函数即完成了用户空间和内核空间的数据交互。
      unsigned long copy_to_user( void __user *to,
                                  const void *from,
                                  unsigned long n );//

      unsigned long copy_from_user( void *to,
                                    const void __user *from,
                                    unsigned long n );

    二、给出一个具体的例子以便理解,偷懒起见,直接copy链接处的例子,为保证代码完整性,作者及说明在代码中有所体现。

      //proc_study.c
      #include <linux/module.h>
      #include <linux/kernel.h>
      #include <linux/proc_fs.h>
      #include <linux/string.h>
      #include <linux/vmalloc.h>
      #include <asm/uaccess.h>
      MODULE_LICENSE("GPL");
      MODULE_DESCRIPTION("Fortune Cookie Kernel Module");
      MODULE_AUTHOR("M. Tim Jones");
      #define MAX_COOKIE_LENGTH       PAGE_SIZE
      static struct proc_dir_entry *proc_entry;
      static char *cookie_pot;  // Space for fortune strings
      static int cookie_index;  // Index to write next fortune
      static int next_fortune;  // Index to read next fortune
     
      int fortune_read( char *page, char **start, off_t off,
                                 int count, int *eof, void *data )
      {
          int len;
          if (off > 0) {
              *eof = 1;
              return 0;
          }
     
          /* Wrap-around */
          if (next_fortune >= cookie_index)
              next_fortune = 0;
     
          len = sprintf(page, "%s\n", &cookie_pot[next_fortune]);
          next_fortune += len;
     
          return len;
      }
     
      ssize_t fortune_write( struct file *filp, const char __user *buff,
                                      unsigned long len, void *data )
      {
          int space_available = (MAX_COOKIE_LENGTH-cookie_index)+1;
          if (len > space_available) {
              printk(KERN_INFO "fortune: cookie pot is full!\n");
              return -ENOSPC;
          }
     
          if (copy_from_user( &cookie_pot[cookie_index], buff, len )) {
              return -EFAULT;
          }
     
          cookie_index += len;
          cookie_pot[cookie_index-1] = 0;
     
          return len;
      }
     
      int init_fortune_module( void )
      {
          int ret = 0;
          cookie_pot = (char *)vmalloc( MAX_COOKIE_LENGTH );
          if (!cookie_pot) {
              ret = -ENOMEM;
          } else {
              memset( cookie_pot, 0, MAX_COOKIE_LENGTH );
              proc_entry = create_proc_entry( "fortune", 0644, NULL );
              if (proc_entry == NULL) {
                  ret = -ENOMEM;
                  vfree(cookie_pot);
                  printk(KERN_INFO "fortune: Couldn't create proc entry\n");
              } else {
                  cookie_index = 0;
                  next_fortune = 0;
                  proc_entry->read_proc = fortune_read;
                  proc_entry->write_proc = fortune_write;
                  proc_entry->owner = THIS_MODULE;
                  printk(KERN_INFO "fortune: Module loaded.\n");
              }
          }
     
          return ret;
      }
     
      void cleanup_fortune_module( void )
      {
          remove_proc_entry("fortune", &proc_root);
          vfree(cookie_pot);
          printk(KERN_INFO "fortune: Module unloaded.\n");
      }
     
      module_init( init_fortune_module );
      module_exit( cleanup_fortune_module );

      //Makefile 自己改的一个Makefile
      #ifneq ($(KERNELRELEASE),)
        obj-m := my_proc.o
        my_proc-objs := proc_study.o
      #else
      KERNELDIR ?= /lib/modules/$(shell uname -r)/build
      PWD := $(shell pwd)
     
      default:
          $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
     
      clean:
          rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
          rm -rf Module.* modules.*
     
      .PHONY: default clean
      #endif

      编译生成my_proc.ko
      下面来测试下:
      [root@xxx proc]# ls /proc/fortune -al
      -rw-r--r-- 1 root root 0 05-13 16:23 /proc/fortune

      [root@xxx proc_study]# insmod my_proc.ko
      [root@xxx proc_study]# dmesg
      fortune: Module loaded.
      [root@xxx proc]# echo "Hello, Just a test" > /proc/fortune
      [root@xxx proc]# echo "Secondary test" > /proc/fortune  
      [root@xxx proc]# ls /proc/fortune  -al                     
      -rw-r--r-- 1 root root 0 05-01 07:04 /proc/fortune
      [root@xxx proc]# cat /proc/fortune
      Secondary test
      [root@xxx proc]# cat /proc/fortune

      [root@xxx proc_study]# rmmod my_proc
      [root@xxx proc_study]# dmesg
      fortune: Module loaded.
      fortune: Module unloaded.
     




    展开全文
  • 想要提高Oracle交互性,通过定义与使用替换变量就可以实现了,下面就为您详细介绍利用替换变量提高Oracle交互性的方法,供您参考。 一、定义与使用替换变量。 在Oracle提供的相关工具中,如SQL PLUS管理平台中...

    想要提高Oracle交互性,通过定义与使用替换变量就可以实现了,下面就为您详细介绍利用替换变量提高Oracle交互性的方法,供您参考。

    一、定义与使用替换变量。

    在Oracle提供的相关工具中,如SQL PLUS管理平台中,允许数据库管理员采用替换变量来提高SQL语句的灵活性。替换变量的定义跟普通变量的定义类似,只需要在变量名前面加入&符号即可。如上面例子中的“&name_filed”就表示一个替换变量。当运行一段有替换变量的SQL语句时,数据库系统会自动提醒用户要输入哪些变量值。

    如在如下这条语句中,&name_filed表示用户想要显示的字段值。若用户想要显示某个表中的多个字段的话,则可以在这里定义多个替换变量。而条件语句中的'&NAME'则表示一个限制条件,或者说一个查询参数。这条语句的大意就是用户输入员工的名字,然后让系统查询出用户想了解的信息,如用户的身份证号码等等。

    SQL> select &name_filed from dtmfg.ad_user t where t.name like '&NAME';

    细心的读者或许会发现,在查询条件中的替换变量,为什么要用单引号括起来呢?这是因为,我们在写SQL语句的时候,若字段时字符型的话,就需要用单引号括起来。所以,在定义替换变量的时候,跟平时写SQL语句类型。若数据类型是字符或者日期型的,则需要在定义替换变量的时候,用单引行括起来。否则的话,在用户执行这条语句、输入变量的时候,每次都需要把括号添加进去。那就非常的麻烦。相比起来,还不如在定义这条SQL语句的时候,就加入单引号。如此,在输入对应值的时候,就不用用单引号括起来了,可以直接输入。

    另外,替换变量不但在Select语句中可以使用,在Update等语句中也可以普遍应用。

    二、定义默认值。

    有时候,对于替换变量我们可能会有默认值。如果数据库管理员已经知道替换变量的具体值,又想避免运行脚本文件时反复出现,则可以给替换变量定义一个默认值。在SQL Plus平台中,数据库管理员可以利用Define命令来定义替换变量的默认值。

    在定义替换变量默认值的时候,需要注意几个问题。

    一是要合理使用单引号。该用单引号括起来的,就要使用单引号;不需要用的时候,坚决不用。否则的话,会造成SQL语句的运行错误。那么什么时候该用单引号呢?这主要是根据SQL语句来的。平时在写SQL语句的过程中要用到单引号的,则在定义默认值的时候,也要用单引号括起来。如果平时不用的话,则就可以不用。如在定义字段名称的默认值时,就不需要用单引号括起来。画蛇添足,反而会导致SQL语句的执行错误

    二是这只是定义了一个默认值。当定义来一个默认值之后,系统就不会提示用户输入相关的参数,而直接采用默认值。如在上面这个例子中,若利用define NAME='SuperUser'这条语句定义了NAME的默认值之后,在执行这条Select语句的时候,就不会再提示用户输入NAME值。我们可以利用Define命令来查看当前环境中所有的可替换变量的值。也可以利用Define NAME来查看可替换变量NAME的默认值。

    三是若用户采用的是脚本文件的话,则可以直接把这个定义默认值的语句放在脚本文件的一开始。如此的话,这个默认值的定义就会随着脚本文件而走。用户不用每次使用脚本文件的时候,都先去定义默认值。这个这个默认值的作用域只是适用于当前的会话。当数据库管理员结束当前的会话后,这个变量的默认值也就失效了。为了在下次重新会话的时候,仍然可以利用这个默认值,故在脚本文件一开始定义可替换变量的默认值,也是非常有必要的。

    四是利用Define命令来定义可替换变量的时候,有一个限制条件。即可替换变量必须是字符型的数据。若用户想定义的可替换变量是数字型的,如员工的薪水,此时,就需要采用ACCEPT命令。否则的话,就是一个无效的默认值。

    若我们有时候不需要这个默认值,需要取消他,改如何处理呢?此时,我们就可以利用undefine命令,来取消某个替换变量的默认值。当然,我们也可以利用Define命令来给某个替换变量设置一个新的值。在实际工作中,可能还是直接采用Define命令来为其设置一个默认值来的方便。

    三、测试完毕后,保存为脚本文件。

    为了增强这个SQL语句的可重用性,我们往往会把写好的SQL语句保存为脚本文件。如此的话,下次需要用到的时候,直接执行这个脚本语句即可。在保存的时候,为了有更好的可读性,笔者有一些小小的建议。

    一是最好在脚本文件的开头,注释一些这条语句的具体用途。俗话说,好记性不如烂笔头。在几个月后,很难确保你还记得这条语句的用途。

    二是给可替换变量取一些比较直观的名字。否则的话,当使用数据库管理员可能直接都不知道某个替换变量所代表的含义。另外,列的替换变量跟查询语句中的替换变量最好进行区分,如可以利用前缀进行区别。如此做的话,这个语句的可阅读性就会增强。

    三是可利用Prompt命令来输出一些提示信息。在编写替换变量的时候,要像编写其他程序一样,养成为每个可替换变量做好注释的习惯。这时作为数据库管理员一个必备的技能之一。

    四、其他解决方案。

    针对Oracle数据库交互性而言,它还提供了一些其他的解决方案。

    如利用ACCEPT、PAUSE、PROMPT三个命令结合使用提供一个模拟的用户输入界面。ACCEPT命令可以让数据库管理员指定替换变量的类型。因为Define定义替换变量默认值的时候,只能够接受字符型数据的默认值。若是其他数据类型的默认值的话,就要用ACCEPT来定义。而PAUSE顾名思义,可以让脚本语句暂时运行,以提供一个更加友好的用户界面。如可以让用户通过输入回车键来执行剩下的脚本语句等等。如此,就给用户一个“喘息”核对数据的机会。

    如可以通过绑定变量的方式,来实现替换变量的功能。绑定变量只在当前会话中存在,同名的绑定变量一最后一个定义为准。绑定变量在赋值的时候,比较麻烦,需要采用Excute命令来给绑定变量进行赋值。所以,在实际应用中,不是很广泛。

    展开全文
  • Java调用批处理或可执行文件 用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式: .....


    Java调用批处理或可执行文件

    用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式:
    ...

    Process process = Runtime.getRuntime().exec(".\\p.exe" ); 
    process.waitfor( ); 


    ...
    在上面的程序中,第一行的“.\\p.exe”是要执行的程序名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行。
    但在windows平台上,如果处理不当,有时并不能得到预期的结果。下面是笔者在实际编程中总结的几种需要注意的情况:
    1、执行DOS的内部命令
    如果要执行一条DOS内部命令,有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上, 可写成exec("cmd.exe /c dir"),在windows 95/98下,可写成“command.exe /c dir”,其中参数“/c”表示命令执行后关闭Dos立即关闭窗口。另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec("my_dir.bat")。如果仅仅写成exec("dir"),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。
    2、打开一个不可执行的文件
    打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。 以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:

    exec("start .\\a.doc" ); 
    exec(
    " c:\\Program Files\\Microsoft Office\\office\\winword.exe .\\a.doc"); 


    显然,前一种方法更为简捷方便。
    3、执行一个有标准输出的DOS可执行程序
    在windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java提供的Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:
    ...

    String ls_1; 
    Process process 
    = Runtime.getRuntime().exec("cmd /c dir \\windows"
    ); 
    BufferedReader bufferedReader 
    = new
     BufferedReader( \ 
    new
     InputStreamReader(process.getInputStream()); 
    while ( (ls_1=bufferedReader.readLine()) != null

    System.out.println(ls_1); 
     
    process.waitfor( ); 


    今天在做客户端程序的自动更新,简单描述一下,就是从服务器上将更新包下载下来,然后在本地解压缩,最后删掉~功能很简单~

    但是问题出在使用JAVA的ZIP模块做文件的解压缩不是想象的那么简单,资源需要释放,一个不小心就没有办法删除掉原有ZIP文件了~资源的占用确实是个大问题,但是好在,客户端程序更新完是要重启的,一切都烟消云散了~对于删除不掉ZIP文件的问题,我也流氓一下~用DEL硬删除~此处一定要注意!

    Process process = Runtime.getRuntime().exec("cmd /c del f:\\aaa.doc" ); 


    这样的调用是没有问题~

     

    Process process = Runtime.getRuntime().exec("del f:\\aaa.doc"); 


    这样写是不可能对的~
    用Java调用Dos命令时直接用以下命令就可以完成:

     

    String command="ping 192.168.1.1" ;
    Runtime.getRuntime().exec(command); 

    并可以使用Process类的getInputStream()方法获取输出结果,但是,我在调用一些工具软件的Dos命令时却出现了问题,输出结果只能取到前面一小部分,经测试发现,exec(command)之后没多久,Java就认为这个进程结束了,并立即开始执行下面的操作,但这时command实际上并没有结束,但由于流的关闭而被迫中断。

    后来用了同事介绍的方法,将这些Dos命令全部放在一个批处理文件当中,并用

    String command="cmd /c start d:\\wmv.bat"


    的方法来调用(如果不加cmd /c的话,执行同样会出错),这样一来,Java只是新起了一个进程去执行批处理,并不会去管进程是否结束,而是直接开始执行下面的语句。

    但这样还是有一个问题,就是Java和这个批处理没法进行交互,我试过了Process中的existValue()及waitFor()方法(都是网上说可用来判断进程是否结束的方法),但都起不到作用,往往是进程已经结束了,但Java还认为没结束,或者干脆是Java认为结束了,但进程却实际还在运行着。

    posted on 2008-01-19 21:18 々上善若水々 阅读(6265) 评论(2)  编辑  收藏 所属分类: J2SE



    java 调用linux 命令"ls" ".sh"  

    2012-04-05 13:05:20|  分类: linux下基本操作 |  标签:java--linux   |字号 订阅


    执行shell命令语法如下(显示指定目录下的文件,类似命令依次类推):

    Runtime.getRuntime().exec(new String[]{"命令", "参数1", "参数2" });

    其中:  command参数第一个command[0]为linux命令,command[1].command[2]...其余项为参数   
    (在网上找了很多例子,千篇一律,只是发布的作者不同罢了)

    例:
    /** 在/home/thinking//workplace 目录下创建myTest文件夹*/

    Runtime.getRuntime().exec(new String[]{"mkdir", "/home/thinking/workplace/myTest"});

    /** 显示thinking 目录下的文件 */

    Runtime.getRuntime().exec(new String[]{"ls", "/home/thinking/" });

    /** 创建文件 */

    Runtime.getRuntime().exec(new String[]{"touch", "/home/thinking//workplace/mytest"});


    下面列举一个比较容易理解形式,调用shell脚本:

    String[] commands = new String[]{"/home/thinking/helloWorld.sh", "param1", "param2"};

    try { Process process = Runtime.getRuntime().exec(command); InputStream im = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(im)); String line = ""; while((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }

    上述命令运行了 /home/thinking目录下的 helloWorld.sh这个脚本,其中param1 和 param2为helloWorld的参数列表,此段代码将输出脚本中echo的信息。



    Java调用可执行文件和批处理命令

     
    发布时间:2008.01.24 04:36     来源:赛迪网    作者:xyz20003

    在java调用exe,com可执行文件和bat,cmd批处理文件
    一。运行exe文件

       1. Java JDK里已经提供了调用的方法,不在累赘,代码如下。

        try {
            String command = "notepad";
            Process child = Runtime.getRuntime().exec(command);
        } catch (IOException e) {
        }

    二。运行bat(批处理)文件

       1.

    import java.io.*;

    public class Test
    {
        public static void main(String[] args)
        {
            System.out.println("args : " + java.util.Arrays.asList(args));

            try
            {
                String command = args.length == 0 ? "notepad" : args[0];
                Process child = Runtime.getRuntime().exec(command);

                String line = null;
                BufferedReader reader = new BufferedReader(new InputStreamReader(child.getInputStream()));
                while((line = reader.readLine()) != null)
                {
                    System.out.println(line);
                }
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }

    }

       2. 虽然网上有人说找不到直接执行bat文件的方法,但我使用这种方法似乎也可以达到执行bat文件的效果,原本的希望是看看能从Process中读到什么信息,结果直接把bat文件中的内容按行打印并执行了。
       3. 但因为InputStream一直没有关闭,这个循环变成了一个死循环,不知道如何判断批处理文件何时执行完毕。





    展开全文
  • 或者是其他形式的可执行文件,只要无法查看程序内容就行.  但是,如果你仅仅是看不见内容就行了的话,不妨用  gzexe a.sh  原来的 a.sh 就被存为 a.sh~,新的 a.sh 是乱码,但是可以用 sh 的方式运行。 ...
    或者是其他形式的可执行文件,只要无法查看程序内容就行.
    

      但是,如果你仅仅是看不见内容就行了的话,不妨用

      gzexe a.sh

      原来的 a.sh 就被存为 a.sh~,新的 a.sh 是乱码,但是可以用 sh 的方式运行。

      一、 如果在 C 程序用 system() 来运行,就一点意义都没有了,

      因为 system 就是就是又开了一个shell进程,然后其内容也是shell -c "" 中的参数。你可以在命令行中测试:

      system("ls -l") 就相当于

      sh -c 'ls -l'

      这应该能够解释为什么在C中会暴露所有源码的问题。

      二、如果是用shell,就一定不可能存在保险的加密方法!

      因为shell是一种解释性的语言,它必须能被读,被逐行被解释器读入,所以不管用了何种方式,最后都逃不掉必须还原为明文,明文还能被读这一过程,这就决定了shell源码不可能有有效加密方式的宿命。

      比如有做同样一件事的两个程序

      ---x--x--x 1 jingyi stud 806 Jan 14 03:02 a.out

      ---x--x--x 1 jingyi stud 94 Dec 20 15:49 a.sh

      a.out 为 C 的编译产物,而 a.sh 是 shell 程序。 它们都有执行位,但是 a.out 能被执行,但是 a.sh 则不行!原因就是 a.sh 缺了 -r 位。

      三、在不能保证安全的情况下,敏感口令还是不要出现在shell程序中为好。很多程序为了安全,不但不出现在程序中,还不准出现在命令行中,特意做成交互式的。因为在命令行中,通过 history 或其它类似手段重现历史命令,非常不安全。

      四、如果只是出于防范不太高手的内部用户,执行

      gzexec a.sh

      后,a.sh 中源码会看不见了。原来的文件被更名为 a.sh~ ,并且不需要了,你可以删除或存在其它地方。

      这只是个变通的方式(只能称之为变通,不能称这为加密,因为学过一点shell编程的人就能很轻松地还原它),也许对不太 geek 的用户群中可以凑合用用。

      希望以上解释对你和众多想加密shell的人有点帮助。

    本文来自:Linux宝库 -- http://doc.linuxpk.com/426.html


    展开全文
  • appium-doctor’ 不是内部或外部命令,也不是可运行的程序1. appium-doctor’ 不是内部或外部命令,也不是可运行的程序--问题解决2. appium 介绍 1. appium-doctor’ 不是内部或外部命令,也不是可运行的程序–问题...
  • 在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复任务。是很多系
  • python 改变工作目录,运行.cp文件

    千次阅读 2018-03-08 08:48:56
    1、命令行模式与Python交互模式 a、命令行模式进入python交互模式: 格式:python b、退出python交互模式: 格式:exit() c、区别 运行.py文件不能在Python交互式环境中进行2、python文件名 a、格式: 文件名...
  • http://www.subversion.org.cn/svnbook/1.4/svn.webdav.clients.html所有的WebDAV客户端分为三类—独立应用程序,文件浏览器扩展或文件系统实现,这些分类定义了WebDAV用户可用的功能。表 C.1 “”给WebDAV常见...
  • 常见的文件扩展名

    万次阅读 多人点赞 2019-03-01 09:45:58
    xml:具有结构的标记电子文件 json:轻量级的数据交换格式,层次结构简洁和清晰 conf:配置信息文件 jsp:java嵌入式网页脚本文件 phps:php的源代码文件 asp:MicroSoft公司开发的创建动态交互式网页服务器端脚本...
  • 计算机分为超级计算机、工业控制计算机、网络计算机、个人计算机、嵌入式计算机五类。主要由硬件系统和软件系统组成。” 计算机的特点:数值计算、逻辑计算、存储记忆功能 总结 : 能够按照程序运行、自动、高速...
  • 强制让浏览器允许JS读写...符合浏览器的安全标准,属于浏览器的设计缺陷所以浏览器是可能这样支持的--就是没有发布的页面,要执行js操作本机的文件?这是可以的,但也是需要通过人机交互来提醒用户的。问题回复...
  • 相信接触过Python的伙伴们都知道运行Python脚本程序的方式多种,目前主要的方式:交互式环境运行、...一般来说,顺利安装Python之后,两种方式可以进入Python交互性环境。一种是在Python自带的IDLE中直接...
  • Ansible 使用playbook文件运行

    千次阅读 2019-08-13 00:15:47
    ansible playbooks 是使用ansible简单的配置管理部署系统的基础,使用YAML语法格式的配置文件。每一个playbook中包含一系列的任务。使用ansible playbook可以更方便的管理、维护多态主机。 1、yaml语法 yaml是”...
  • Qt与C语言交互探讨

    千次阅读 2015-08-06 17:29:48
    界面线程由Qt实现,底层数据处理主要由C语言实现,此时C和Qt的数据交互不可避免。   1.1、Qt信号与槽   使用信号与槽的机制进行C与Qt的多线程通信。 1、定义一个用于发射信号的类SysCourier,并创建其对象...
  • 客户端交互技术简介

    千次阅读 2014-10-05 14:15:01
    随着网络应用的不断丰富,客户端交互技术也如雨后春笋一般,遍地开花。正是这些技术的支持,我们的互联网世界变得更加丰富多彩。一个浏览器上,不用说是简单的动画效果,就是一...预示客户端交互技术为了的持续发展
  • Android与Unity交互研究

    万次阅读 多人点赞 2015-07-03 00:27:25
    unity与android交互的由来 unity简单介绍 unity与android交互介绍 unity调用android的方法 android调用untiy的方法unity与android交互的由来本人在项目开发过程中,遇到这样一个需求,把unity的场
  • 从 Windows 命令行运行 Linux 工具 使用 wsl <command>(或 wsl.exe <command>)从 Windows 命令提示符 (CMD) 或 PowerShell 运行 Linux ...如果可执行程序(exe)文件不在Windows的环境变量中,可以通过/
  • 计算机网络之文件传送协议FTP

    千次阅读 2015-09-24 09:18:09
    FTP 提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限。FTP 屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件文件传送协议 FTP 只提供文件传送的一些基本的...
  • 在开源中国上关注ceph翻译,没有看到ceph论文的相关翻译, 索性在阅读过程中把它翻译了出来,花费了几个周末时间,翻译过程中收获颇多,现把译文分享出来,如对您有益则倍感荣幸,肯定很多不足之处。如纰漏之 处...
  • VSCode运行文件C++教程:使用CMake

    万次阅读 多人点赞 2019-02-03 12:04:02
    一直以来出于一种奇妙心态的我非常厌恶使用 Visual Studio 这种笨重的IDE,向来用VScode作为C++主力编辑器,然而很遗憾VSCode自身怎么支持C++多文档的编译(很麻烦,要不停的修改json配置文件),无奈为了寻求出路就...
  • 需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互。 expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动...
  • Unity--碰撞交互

    万次阅读 2019-07-16 00:34:31
    本博重在回顾之前的知识点,具有普适,大神绕道。 我们来实验Unity很重要的碰撞检测系统,实现门的开和关,说白了就是碰撞交互产生动画,动画,动画,并且是声音的动画。 我们首先来打开之前创建的Project,...
  • 文件传输协议FTP

    千次阅读 2018-05-11 14:48:31
    文件传输协议FTP(File Transfer Protocol)是因特网中使用最广泛的文件传输... 文件传输协议基于TCP的FTP和基于UDP的简单文件传输协议TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是:若要存...
  • 人机交互

    千次阅读 2016-06-12 00:18:39
    Material Design是由谷歌的设计团队创建的一种设计语言,旨在为手机、平板电脑、台式机和其他平台提供更一致、更广泛的外观和感觉,帮助设计师们创建易用和实用较强的网站和应用程序。这个概念基于一个不断更新...
  • python 交互式编程与脚本式编程

    千次阅读 2019-10-07 16:56:57
    交互式编程需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。 linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: $ python Python 2.7.6(default,Sep 92014,15:04:36...
  • Linux文件系统目录结构详解

    万次阅读 2017-10-08 13:09:34
    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux...
  • Unity中的 原生插件/平台交互 原理

    千次阅读 多人点赞 2017-11-05 20:50:14
    时候不可避免的需要使用和编写原生插件,例如一些第三方插件只提供C/C++原生插件、复用已的C/C++模块等。一些功能是Unity3D实现不了,必须要调用Android/iOS原生接口,比如获取手机的硬件信息(UnityEngine....
  • 多进程如何加锁读写文件队列

    千次阅读 2013-08-18 16:02:59
    注:以a+方式open一个文件的时候,write文件是个原子操作,多进程之间不会出现交叉写的情况,并且write大小没有限制的,受4k大小限制。 write一个文件内核是加锁的,会保证原子执行。   ssize_t write...
  • 在工作组模式中一切正常,加入域后也提示欢迎加入域 ,重启后输入域用户名和密码却提示用户名和密码出错或你的本地策略允许你采用交互式登录(域用户名和密码是正确的);并且改用此WIN2KPRO客户机的系统管理...
  •  由于输入设备是多种多样的,而且对一个应用程序而言,可以多个输入设备,同一个设备又可能为多个任务服务,这就要求对输入过程的处理要合理的模式。  请求模式(Request Mode):在请求模式下,输入设备的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 453,038
精华内容 181,215
关键字:

不可执行文件有交互性吗