LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1443|回复: 9

怎样使sudo保持LD_LIBRARY_PATH等环境变量?

[复制链接]
发表于 2006-7-11 15:24:51 | 显示全部楼层 |阅读模式
怎样使sudo保持LD_LIBRARY_PATH等环境变量?
 楼主| 发表于 2006-7-12 09:52:03 | 显示全部楼层
以前问了 普通用户怎样拥有控制/dev/console的权限,
好像是没办法,

现在想用sudo实现,那位讲讲
回复 支持 反对

使用道具 举报

发表于 2006-7-12 10:30:07 | 显示全部楼层
你说的不是很明确,按我的理解可能是你想让LD_LIBRARY_PATH变量让sudo子进程使用。
如果我没理解错的话,那你需要设置LD_LIBRARY_PATH后
  1. $export LD_LIBRARY_PATH
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-7-12 10:32:07 | 显示全部楼层
Post by zhanjs
以前问了 普通用户怎样拥有控制/dev/console的权限,
好像是没办法,

现在想用sudo实现,那位讲讲


  1. $grep console /etc/udev/rules.d/*
  2. /etc/udev/rules.d/50-udev.rules:# console devices
  3. /etc/udev/rules.d/50-udev.rules:KERNEL=="console",              NAME="%k", MODE="0600", OPTIONS="last_rule"
  4. /etc/udev/rules.d/95-pam-console.rules:ACTION=="add", SYSFS{dev}="?*", KERNEL=="?*", RUN+="/sbin/pam_console_apply $env{DEVNAME} $env{DEVLINKS}"
复制代码


修改udev配置就可以了,/etc/udev/rules.d/50-udev.rules文件
回复 支持 反对

使用道具 举报

发表于 2006-7-14 08:58:33 | 显示全部楼层
Post by hellwolf

  1. $grep console /etc/udev/rules.d/*
  2. /etc/udev/rules.d/50-udev.rules:# console devices
  3. /etc/udev/rules.d/50-udev.rules:KERNEL=="console",              NAME="%k", MODE="0600", OPTIONS="last_rule"
  4. /etc/udev/rules.d/95-pam-console.rules:ACTION=="add", SYSFS{dev}="?*", KERNEL=="?*", RUN+="/sbin/pam_console_apply $env{DEVNAME} $env{DEVLINKS}"
复制代码


修改udev配置就可以了,/etc/udev/rules.d/50-udev.rules文件


哦!这个grep console /etc/udev/rules.d/*的用法真绚!以后我也用这种办法来找不知道在哪里的配置文件设置!收藏了
回复 支持 反对

使用道具 举报

发表于 2006-7-14 11:46:49 | 显示全部楼层
我想如果你真的很菜的说,是不是说在打开文件里没有rmvb的文件,其实如果安了解码器就应该能放,你直接在所有文件里选就能放了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-2 21:26:51 | 显示全部楼层
本来以为没希望解决了,十分感谢hellwolf

我用的redhat9, 没法现udev, 怎么办?

我很菜,请详细点
回复 支持 反对

使用道具 举报

发表于 2006-8-2 21:35:53 | 显示全部楼层
建议:升级

如果你实在不想升级,那么在你的
/etc/rc.local文件的最后加入一行:
  1. chmod a+w /dev/console
复制代码
更好的方法是设置专门的组可读写。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-11 18:23:42 | 显示全部楼层
我要控制console,其实是写了一段pc喇叭发声的程序,
redhat9下解决了

fc4下又有问题,安hellwolf 的方法获得了console的控制权,可是喇叭还是不发声,
root就可以


  1. #include < fcntl.h >
  2. #include < stdio.h >
  3. #include < stdlib.h >
  4. #include < string.h >
  5. #include < unistd.h >
  6. #include < sys/ioctl.h >
  7. #include < sys/types.h >
  8. #include < linux/kd.h >

  9. /* 设定默认值 */
  10. #define DEFAULT_FREQ 440 /* 设定一个合适的频率 */
  11. #define DEFAULT_LENGTH 200 /* 200 微秒,发声的长度是以微秒为单位的*/
  12. #define DEFAULT_REPS 1 /* 默认不重复发声 */
  13. #define DEFAULT_DELAY 100 /* 同样以微秒为单位*/

  14. /* 定义一个结构,存储所需的数据*/
  15. typedef struct {
  16. int freq; /* 我们期望输出的频率,单位为Hz */
  17. int length; /* 发声长度,以微秒为单位*/
  18. int reps; /* 重复的次数*/
  19. int delay; /* 两次发声间隔,以微秒为单位*/
  20. } beep_parms_t;


  21. /* 打印帮助信息并退出*/
  22. void usage_bail ( const char *executable_name ) {
  23. printf ( "Usage: \n \t%s [-f frequency] [-l length] [-r reps] [-d delay] \n ",
  24. executable_name );
  25. exit(1);
  26. }

  27. / * 分析运行参数,各项意义如下:
  28. * "-f <以HZ为单位的频率值 >"
  29. * "-l <以毫秒为单位的发声时长 >"
  30. * "-r <重复次数 >"
  31. * "-d <以毫秒为单位的间歇时长 >"
  32. */
  33. void parse_command_line(char **argv, beep_parms_t *result) {
  34. char *arg0 = *(argv++);
  35. while ( *argv ) {
  36. if ( !strcmp( *argv,"-f" )) { /*频率*/
  37. int freq = atoi ( *( ++argv ) );
  38. if ( ( freq <= 0 ) | | ( freq > 10000 ) ) {
  39. fprintf ( stderr, "Bad parameter: frequency must be from 1..10000\n" );
  40. exit (1) ;
  41. } else {
  42. result->freq = freq;
  43. argv++;
  44. }
  45. } else if ( ! strcmp ( *argv, "-l" ) ) { /*时长*/
  46. int length = atoi ( *(++argv ) );
  47. if (length < 0) {
  48. fprintf(stderr, "Bad parameter: length must be >= 0\n");
  49. exit(1);
  50. } else {
  51. result->length = length;
  52. argv++;
  53. }
  54. } else if (!strcmp(*argv, "-r")) { /*重复次数*/
  55. int reps = atoi(*(++argv));
  56. if (reps < 0) {
  57. fprintf(stderr, "Bad parameter: reps must be >= 0\n");
  58. exit(1);
  59. } else {
  60. result->reps = reps;
  61. argv++;
  62. }
  63. } else if (!strcmp(*argv, "-d")) { /* 延时 */
  64. int delay = atoi(*(++argv));
  65. if (delay < 0) {
  66. fprintf(stderr, "Bad parameter: delay must be >= 0\n");
  67. exit(1);
  68. } else {
  69. result->delay = delay;
  70. argv++;
  71. }
  72. } else {
  73. fprintf(stderr, "Bad parameter: %s\n", *argv);
  74. usage_bail(arg0);
  75. }
  76. }
  77. }

  78. int main(int argc, char **argv) {
  79. int console_fd;
  80. int i; /* 循环计数器 */
  81. /* 设发声参数为默认值*/
  82. beep_parms_t parms = {DEFAULT_FREQ, DEFAULT_LENGTH, DEFAULT_REPS,
  83. DEFAULT_DELAY};
  84. /* 分析参数,可能的话更新发声参数*/
  85. parse_command_line(argv, &parms);

  86. /* 打开控制台,失败则结束程序*/
  87. if ( ( console_fd = open ( "/dev/console", O_WRONLY ) ) == -1 ) {
  88. fprintf(stderr, "Failed to open console.\n");
  89. perror("open");
  90. exit(1);
  91. }

  92. /* 真正开始让扬声器发声*/
  93. for (i = 0; i < parms.reps; i++) {
  94. /* 数字1190000从何而来,不得而知*/
  95. int magical_fairy_number = 1190000/parms.freq;

  96. ioctl(console_fd, KIOCSOUND, magical_fairy_number); /* 开始发声 */
  97. usleep(1000*parms.length); /*等待... */
  98. ioctl(console_fd, KIOCSOUND, 0); /* 停止发声*/
  99. usleep(1000*parms.delay); /* 等待... */
  100. } /* 重复播放*/
  101. return EXIT_SUCCESS;
  102. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-9-14 20:03:25 | 显示全部楼层
加载pcspkr内核模块:
  1. #modprobe pcspkr
复制代码

测试喇叭的shell代码:
  1. $echo $'\a'
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表