LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: coderoar

PPS官方低调发布PPS for Ubuntu 8.04

[复制链接]
发表于 2009-8-25 14:00:54 | 显示全部楼层
谁试过给mplayer打pps提供的补丁么?仍然需要root权限嘛?
回复 支持 反对

使用道具 举报

发表于 2009-8-25 14:20:25 | 显示全部楼层
root 权限没办法避免的,因为 pps 的库是需要 root 权限的。。
回复 支持 反对

使用道具 举报

发表于 2009-8-25 17:27:21 | 显示全部楼层
sopcast不是开源的,但sopcast用起来很方便。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-25 18:59:55 | 显示全部楼层
gmlive里面就只有sc从来就没让我失望过,其它的都只是摆设,老连不上。
回复 支持 反对

使用道具 举报

发表于 2009-8-26 11:57:39 | 显示全部楼层
日月版主真是少见呀,呵呵
回复 支持 反对

使用道具 举报

发表于 2009-8-26 14:51:23 | 显示全部楼层
上张图吧

回复 支持 反对

使用道具 举报

发表于 2009-8-29 11:48:00 | 显示全部楼层

解决 root 权限问题

嘿嘿,用虚拟机试了试,不错。
把 wrapper 加个简单 Makefile 单独打个包会更好。
[color="Red"]ppswrapper-server 的 suid 权限位很邪恶。

关于 root 权限,应当是 pps 代码质量问题:
给 mplayer 打 pps 提供的补丁,编译安装,
普通用户 strace ./mplayer -playlist playlist,等的够久,也能弓单出播放画面,
同时,会发现大量 msgsnd 报错 EACCES,
ipcs -q 会发现,两个 perms 权限位设置为 0,不给读写权限,普通用户当然不能正常使用,
所以,pps 代码中应该有 "msgget(xxx, 0|IPC_CREAT|IPC_EXCL);" 或 "msgget(xxx, 0);" 一类的用法。

解决方法:
1、给 pps 报 bug
2、用 虚拟机 凑合下
3、自己编译个只包含 msgget 的动态库,使 "msgget(xxx, xxx|0);"相当于"msgget(xxx, xxx|0600);",以 "LD_PRELOAD=./lib/libmsgget.so ./cmd"形式执行,覆盖 libc 提供的 msgget,变相给普通用户读写权限
4、给 glibc 打补丁,使 "msgget(xxx, xxx|0);"相当于"msgget(xxx, xxx|0600);",单独编译一份安装到非正常目录

方法3 看起来很简单,做起来很麻烦,头文件依赖关系比较复杂
[color="Red"]方法4 验证通过,编译方法如下
  1. cd /tmp
  2. wget -c http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2
  3. tar -xvf glibc-2.7.tar.bz2
  4. cd glibc-2.7
  5. [color="Red"]sed -i "s#return INLINE_SYSCALL (ipc, 5, IPCOP_msgget, key, msg***#&|0600#" sysdeps/unix/sysv/linux/msgget.c[/color]
  6. cd ..
  7. mkdir glibc-build
  8. cd glibc-build/
  9. CFLAGS="-mtune=generic -march=i686 -O2" \
  10. ../glibc-2.7/configure --prefix=[color="Red"]/tmp/libc[/color] \
  11. --disable-profile \
  12. --enable-kernel=2.6 \
  13. --with-headers=/usr/include \
  14. --with-tls \
  15. --with-__thread
  16. make
  17. make install
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-8-30 15:23:48 | 显示全部楼层
上面方法4 对应 glibc 补丁
  1. --- sysdeps/unix/sysv/linux/msgget.c-        2001-07-06 12:56:12.000000000 +0800
  2. +++ sysdeps/unix/sysv/linux/msgget.c        2009-08-30 15:12:54.705657004 +0800
  3. @@ -33,5 +33,5 @@
  4.       key_t key;
  5.       int msg***;
  6. {
  7. -  return INLINE_SYSCALL (ipc, 5, IPCOP_msgget, key, msg***, 0, NULL);
  8. +  return INLINE_SYSCALL (ipc, 5, IPCOP_msgget, key, msg***|0600, 0, NULL);
  9. }
复制代码


此补丁对一般系统无害,但是请不要用其补丁现有系统的 glibc。
回复 支持 反对

使用道具 举报

发表于 2009-8-30 17:27:37 | 显示全部楼层
Post by 聚焦深空;2021561
嘿嘿,用虚拟机试了试,不错。
把 wrapper 加个简单 Makefile 单独打个包会更好。
[color="Red"]ppswrapper-server 的 suid 权限位很邪恶。

关于 root 权限,应当是 pps 代码质量问题:
给 mplayer 打 pps 提供的补丁,编译安装,
普通用户 strace ./mplayer -playlist playlist,等的够久,也能弓单出播放画面,
同时,会发现大量 msgsnd 报错 EACCES,
ipcs -q 会发现,两个 perms 权限位设置为 0,不给读写权限,普通用户当然不能正常使用,
所以,pps 代码中应该有 "msgget(xxx, 0|IPC_CREAT|IPC_EXCL);" 或 "msgget(xxx, 0);" 一类的用法。

解决方法:
1、给 pps 报 bug
2、用 虚拟机 凑合下
3、自己编译个只包含 msgget 的动态库,使 "msgget(xxx, xxx|0);"相当于"msgget(xxx, xxx|0600);",以 "LD_PRELOAD=./lib/libmsgget.so ./cmd"形式执行,覆盖 libc 提供的 msgget,变相给普通用户读写权限
4、给 glibc 打补丁,使 "msgget(xxx, xxx|0);"相当于"msgget(xxx, xxx|0600);",单独编译一份安装到非正常目录

方法3 看起来很简单,做起来很麻烦,头文件依赖关系比较复杂
[color="Red"]方法4 验证通过,编译方法如下

  1. cd /tmp
  2. wget -c http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2
  3. tar -xvf glibc-2.7.tar.bz2
  4. cd glibc-2.7
  5. [color="Red"]sed -i "s#return INLINE_SYSCALL (ipc, 5, IPCOP_msgget, key, msg***#&|0600#" sysdeps/unix/sysv/linux/msgget.c[/color]
  6. cd ..
  7. mkdir glibc-build
  8. cd glibc-build/
  9. CFLAGS="-mtune=generic -march=i686 -O2" \
  10. ../glibc-2.7/configure --prefix=[color="Red"]/tmp/libc[/color] \
  11. --disable-profile \
  12. --enable-kernel=2.6 \
  13. --with-headers=/usr/include \
  14. --with-tls \
  15. --with-__thread
  16. make
  17. make install
复制代码

嗯,不错. 我想有解决方法的.
回复 支持 反对

使用道具 举报

发表于 2009-8-30 20:48:57 | 显示全部楼层
已经用 preload 的方式解决了需要 root 权限的问题.
回复 支持 反对

使用道具 举报

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

本版积分规则

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