??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
如果一个进E是?nbsp;root w䆾来运行的Q那么上面这两个 ID 可以?nbsp;setuid/seteuid 随便修改Q想怎么改就怎么改,Ҏ(gu)改去都可以?
但是如果一个进E是以普通用戯n份来q行的,那么上面q两?nbsp;ID 一般来说是相同的,q且也不能随便修攏V只有一U情况例外:(x)此进E的可执行文件的权限标记中,讄?#8220;讄用户 ID”位!
在命令行中,讄一个可执行文g?#8220;讄用户 ID”位的最单的Ҏ(gu)Q就是用
chmod +s /path/to/file
q个命o(h)?
一旦用?jin)这个命令之后,再执行这个文Ӟ?
那么生成的进E的 effective user ID 变成了(jin)q个可执行文件的 owner user IDQ属ȝ?nbsp;IDQ,
?nbsp;real user ID 仍然是启动这个程序时所用的用户?nbsp;ID?
打个比方来说Q如果有q样的一个文Ӟ(x)
引用Q?em>-rw[color=red]s[/color]r-[color=red]s[/color]r-x 1 susesuse susesuse 7902 2006-08-31 13:22 tuid
注意q个文g已经?nbsp;chmod +s 命o(h)讄q?#8220;讄用户 ID”位了(jin)?
然后我用 flw q个用户来执行它Q那么生成的q程它的 real user ID 是 flwQ因为我是用 flw q行的)(j)Q但?nbsp;effective user ID 变成了(jin) susesuseQ因个可执行文g被设|了(jin)“讄用户 ID”位,q且它的 owner user ID ?nbsp;susesuseQ?
q时Q这个进E实际上有两个用户权限?jin)。只不过目前生效的是 susesuseQ因此它目前能够且只能够操作 susesuse 用户的文Ӟ如果现在我又惌操作 flw 用户的文件怎么办?
很简单,只需?nbsp;seteuid( getuid() ) 可以了(jin)。执行完q句之后Qeffective user ID 变成和 real user ID 一样了(jin)Q都变成 flw ?jin)?
可是如果q了(jin)一?x)儿我又惌变回来怎么办?因ؓ(f) effective user ID ?nbsp;real user ID 此时都变成了(jin) flw ?jin),所以操作系l必d有一个地方保存(sh)原来?#8220;讄用户 ID”Q也是可执行文件的 owner user IDQ,不然{你再想?nbsp;seteuid 的时候,操作pȝ׃知道你有没有那个权利?jin)。(M能再去访问一ơ文件系l吧Q那样也太没有效率了(jin)Q?
操作pȝZ(jin)能够在设|了(jin) seteuid 之后Q再ơ设|回来,所以特地将原来?#8220;讄用户 ID”保存?sh)来了(jin),q个保存?sh)来的设|用?nbsp;ID 自然叫?#8220;保存的设|用?nbsp;ID”?
下面看一D写的例子程序:(x)
flw@Sleeper:~$ whoami
flw
flw@Sleeper:~$ cat tuid.c
# include <stdio.h>
# include <sys/types.h>
# include <pwd.h>
int main( void )
{
struct passwd *pwd;
pwd = getpwuid( geteuid() );
printf( "effective UID: [%s]\n", pwd->pw_name );
system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );
printf( "\nset EUID to `flw'..\n" );
pwd = getpwnam( "flw" );
seteuid(pwd->pw_uid);
pwd = getpwuid( geteuid() );
printf( "effective UID: [%s]\n", pwd->pw_name );
system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );
printf( "\nset EUID to `root'..\n" );
seteuid(0);
pwd = getpwuid( geteuid() );
printf( "effective UID: [%s]\n", pwd->pw_name );
system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );
return 0;
}
flw@Sleeper:~$ su root -c "cc -o tuid tuid.c; chmod +s tuid; ls -al tuid"
Password:
-rwsr-sr-x 1 root root 7902 2006-08-31 13:55 tuid
flw@Sleeper:~$ ./tuid
effective UID: [root]
-rw-r--r-- 1 root root 0 2006-08-31 13:55 /tmp/foo.txt
set EUID to `flw'..
effective UID: [flw]
-rw-r--r-- 1 flw root 0 2006-08-31 13:55 /tmp/foo.txt
set EUID to `root'..
effective UID: [root]
-rw-r--r-- 1 root root 0 2006-08-31 13:55 /tmp/foo.txt
flw@Sleeper:~$
]]>
]]>
#include <C8051f020.h>
#define SYS_CLK 22118400
typedef struct //存储l构?br>{
unsigned char AD[93]; //2543的AD数据
unsigned char shi; //gprs的数?br> unsigned char fen;
unsigned char miao;
unsigned long jingdu_zheng;
unsigned long jingdu_xiao;
unsigned long weidu_zheng;
unsigned long weidu_xiao;
unsigned char sudu_zheng;
unsigned char sudu_xiao;
}ram;
typedef struct //定义一个存储地址l构?br>{
unsigned char adr_suocun; //锁存?位地址
unsigned char dptr_gao; //dptr
unsigned char dptr_di;
}ADR_struct;
void sysclk_Init(void);
void dog_Init(void);
void port_Init(void);
void cunchu_Init(void);
void cunchu_Init1(void);
void ram_init(unsigned char ADR);
void save_struct(ram a);
ram read_struct(void);
sbit AHH = P1^0; //用通用I/O来控制访问地址
sbit LB = P1^1;
sbit UB = P1^2;
sbit ALE = P0^5;
ADR_struct dui_shou; //存储队首地址
ADR_struct dui_wei; //存储队尾地址
void main()
{
unsigned char i;
ram a;
sysclk_Init();
dog_Init();
cunchu_Init();
port_Init();
UB = 1;
LB = 0;
dui_wei.adr_suocun=0; //锁存?位地址
dui_wei.dptr_gao=0x08; //dptr
dui_wei.dptr_di=0;
for(i=0;i<93;i++)
a.AD[i]=i;
a.shi = 2;
a.fen = 2;
a.miao= 2;
a.jingdu_zheng= 2;
a.jingdu_xiao=2;
a.weidu_zheng=2;
a.weidu_xiao=2;
a.sudu_zheng=2;
a.sudu_xiao=2;
for(i=0;i<17;i++)
save_struct(a);
}
void ram_init(unsigned char ADR) //ADR锁存的A8-A15 LU_B?字节高(sh)选择位ؓ(f)0 输出抵字节位 ?输出高字节位
{
unsigned char i;
AHH = 1;
for(i=0;i<50;i++); //{待E_
P3 = ADR; //ADR为全局变量 选择存储?br> for(i=0;i<50;i++); //{待E_
AHH = 0; //注意 每一个LU_B ADRl合 对应4K的地址I间 每次?#8220;?#8221;的时候均需先调用此函数
}
void save_struct(ram a) //a存储到FIFO 队尾
{
ram xdata *p;
unsigned int i;
cunchu_Init();
ram_init(dui_wei.adr_suocun); //按队֜址l构体中的suocun初始化sram
dui_wei.dptr_gao<<=8;
p = dui_wei.dptr_gao+dui_wei.dptr_di;
*p = a; //存储a到队?br>
//以下代码为队֜址变换
if((dui_wei.dptr_di==0x91)&&(dui_wei.dptr_gao==0x17)&&(dui_wei.adr_suocun==0xff)&&(UB ==0))
//存储I间已经用完 地址循环x(chng)低地址
{ //此时最后一块内?刚好存储1937个字?nbsp;
dui_wei.dptr_gao = 0x08; //dptr_di==1001 0001 dptr_gao==&&000 10 111
dui_wei.dptr_di = 0x00; //suocun已经满ff UB为有?br> dui_wei.adr_suocun = 0;
UB = !UB;
LB = !LB;
}
else
{
if((dui_wei.dptr_gao<<8)+dui_wei.dptr_di<=(1937-114)) //2kI间最多只能存?7帧即Q?937个字?br> {
p=(dui_wei.dptr_gao<<8)+dui_wei.dptr_di+114; //每数据?14个字?dptr值加?14;
dui_wei.dptr_di = (unsigned char)p;
i = p;
dui_wei.dptr_gao =i>>8;
}
else //2kI间已经用完dptr=1937=0000111 10010001?UdC一?k?切换
{
if(dui_wei.dptr_gao==0x0f) //高八位?00 01 111 切换?000 10 000 低八位全清零
{
dui_wei.dptr_di=0;
dui_wei.dptr_gao ^=0x1f;
}
else if(dui_wei.dptr_gao==0x17) //高八位?00 10 111 切换?000 01 000 低八位全清零
{ //q触发adr_suocun + 1
dui_wei.dptr_di=0;
dui_wei.dptr_gao ^=0x1f;
//以下为adr_suocun + 1处理代码
if(dui_wei.adr_suocun==0xff) //adr_suocun + 1q程?要判断是否需要切换高?sh)字?用完低字节后 再用高字?br> {
LB = !LB;
UB = !UB;
dui_wei.dptr_di = 0;
dui_wei.dptr_gao = 0x08; //高八位切换?00 01 000 低八位清?br> dui_wei.adr_suocun=0;
}
else //未用?不切?br> {
dui_wei.dptr_di = 0; //高八位切换?00 01 000 低八位清?br> dui_wei.dptr_gao = 0x08;
dui_wei.adr_suocun++;
}
}
/* if(dui_wei==dui_shou) //如果存储速度大于d速度 则覆盖最旧的数据
{ //使得队首 向后Ud一??从而丢弃最旧的数据?br> adr_add_change;
}*/
}
}
}
void sysclk_Init(void) //pȝ旉初始?br>{
int i;
OSCXCN = 0x67; //启动外部11.0592MHz震荡?br> for(i = 0;i<255;i++); //{待外部晶体h
while((OSCXCN & 0x80)==0x00); //查询标志?以判断外部时钟是否稳?br> OSCICN = 0x88; //使用外部震荡器做pȝ旉q能时钟丢失检?nbsp;
CKCON = 0x10; //初始化T1旉为系l时?br>}
void dog_Init(void) //看门狗设|ؓ(f)Q关?br>{
EA = 0;
WDTCN = 0xde;
WDTCN = 0xad;
EA = 1;
}
void port_Init(void) //端口分配与输入输出方?br>{
XBR2 = 0x44; //使能交叉开兛_全局׃?配置UART1引脚,外部存储器接口配|到低端?br> XBR0 = 0x04; //配置UARTO引脚
XBR1 = 0x00;
P0MDOUT = 0xf5; //UART的RX引脚总被配置成开漏输?TX引脚为推拉输?RD WR ALE 2543EOC均ؓ(f)推拉输出
P3MDOUT = 0xff; //DT0-DT7
}
void cunchu_Init(void)
{
EMI0CF = 0x0c; //配置外部存储器ؓ(f)复用方式 只用片外XRAM ALE脉宽Z个系l时钟周?br> EMI0TC = 0x6d; //配置外部存储器的接口时序
}
void cunchu_Init1(void)
{
EMI0CF = 0x10;
EMI0TC = 0x6d;
}
tar -I或者bunzip2命o(h)都可以解?bz2文g
tar xvfj example.tar.bz2
tar xvfz example.tar.gz
tar xvfz example.tgz
tar xvf example.tar
unzip example.zip
tar -jvxf some.bzQ就是把tar的zvxf Ҏ(gu)jvxf
zip/tar rh8下有一个图形界面的软gfile-roller可以做这件事。另外可以用unzip *.zip解开zip文gQunrar *.rar解开rar文gQ不qunrar一般系l不自带Q要到网上下载?
# rpm2cpio example.rpm ?cpio -div
# ar p example.deb data.tar.gz | tar zxf -
Alien
提供?tgz, .rpm, .slp?deb{压~格式之间的怺转换Q?sourceforge.net/projects/alien
sEx提供?jin)几乎所有可见的压羃格式的解压接口:(x)sourceforge.net/projects/sex 0058
在多U目录中查找某个文g的方?青v?
find /dir -name filename.ext
du -a | grep filename.ext
locate filename.ext
Linux下Y件安装方法ȝQ?br>
一、rpm包安装方式步骤:(x)
1、找到相应的软g包,比如soft.version.rpmQ下载到本机某个目录Q?br>2、打开一个终端,su -成root用户Q?br>3、cd soft.version.rpm所在的目录Q?br>4、输入rpm -ivh soft.version.rpm
二、deb包安装方式步骤:(x)
1、找到相应的软g包,比如soft.version.debQ下载到本机某个目录Q?br>2、打开一个终端,su -成root用户Q?br>3、cd soft.version.deb所在的目录Q?br>4、输入dpkg -i soft.version.deb
三、tar.gz源代码包安装方式Q?br>1、找到相应的软g包,比如soft.tar.gzQ下载到本机某个目录Q?br>2、打开一个终端,su -成root用户Q?br>3、cd soft.tar.gz所在的目录Q?br>4、tar -xzvf soft.tar.gz //一般会(x)生成一个soft目录
5、cd soft
6?/configure
7、make
8、make install
四、tar.bz2源代码包安装方式Q?br>1、找到相应的软g包,比如soft.tar.bz2Q下载到本机某个目录Q?br>2、打开一个终端,su -成root用户Q?br>3、cd soft.tar.bz2所在的目录Q?br>4、tar -xjvf soft.tar.bz2 //一般会(x)生成一个soft目录
5、cd soft
6?/configure
7、make
8、make install
五、apt方式安装Q?br>1、打开一个终端,su -成root用户Q?br>2、apt-cache search soft 注:(x)soft是你要找的Y件的名称或相关信?br>3、如?中找C(jin)软gsoft.versionQ则用apt-get install soft.version命o(h)安装软g 注:(x)只要你可以上|,只需要用apt-cache search查找软gQ用apt-get install软g
六、bin文g安装Q?br>如果你下载到的Y件名是soft.binQ一般情况下是个可执行文Ӟ安装Ҏ(gu)如下Q?br>1、打开一个终端,su -成root用户Q?br>2、chmod +x soft.bin
3?/soft.bin //q行q个命o(h)可以安装Y件了(jin)
/************关于本文?*******************************************
*filename:Linux下Y件安装方法ȝ
*purpose:ȝ?jin)Linux下各UY件安装方?br>*wrote by: zhoulifa(zhoulifa@163.com) 周立?http://zhoulifa.bokee.com)
Linux爱好?Linux知识传播?SOHO?开发?最擅长C语言~程
*date time:2006-07-26 18:10:00
*Note: M人可以Q意复制代码ƈq用q些文档Q当然包括你的商业用?br>* 但请遵@GPL?br>*Hope:希望来多的h贡献自己的力量,为科学技术发展出?br>*********************************************************************/
七、不需要安装的软gQ?br>有了(jin)些YӞ比如lumaqqQ是不需要安装的Q自带jre解压~后可直接运行。假设下载的是lumaqq.tar.gzQ用方法如下:(x)
1、打开一个终端,su -成root用户Q?br>2、tar -xzvf lumaqq.tar.gz //q一步会(x)生成一个叫LumaQQ的目?br>3、cd LumaQQ
4、chmod +x lumaqq //讄lumaqqq个E序文g为可q行
5、此时就可以q行lumaqq?jin),用命?/lumaqq卛_Q但每次q行要输入全路径或切换到刚才生成的LumaQQ目录?br>6、ؓ(f)?jin)保证不讄路径可以用Q你可以?bin目录下徏立一个lumaqq的链接,用命令ln -s lumaqq /bin/ 卛_Q以后Q何时候打开一个终端输入lumaqq可以启动QQ聊天软g?br>7?
如果你要想lumaqq有个菜单,使用菜单~辑工具Q比如Alacarte Menu
EditorQ找C面生成的LumaQQ目录里的lumaqq讄一个菜单项可以了(jin)Q当然你也可以直接到
/usr/share/applications目录Q按照里面其?.desktop文g的格式生成一个自qdesktop文g卛_?/p>
开发者们不要用red hat/red
flag/suse{第一代Linux操作pȝQ用q些除了(jin)方便Q也是说比较傻瓜型Q、界面豪华点外没什么好。用debian/ubuntu{第二代
吧,apt命o(h)安装软g是最单的。apt命o(h)?x)自动解册Y件安装过E中的依赖问题,?x)把没有的包安装上,会(x)把版本低的包自动升U,当然Q都是要l你认
一ơ的?br> 如果你用Red Hat{第1代LinuxpȝQ安装Y件是比较ȝ(ch)的事Qrpm -ivh
softA.rpm是用来安装softA软g的,但通常情况下可能遇到的问题是提C需要安装softB1, softB2,
softB3{一堆YӞ然后你安装softB1软g包时Q可能又?x)提CZ说需要安装softC1, softC2, softC3,
softC4{一堆Y?#8230;…q样一来你只够时间到处去找这些Y件包?jin)。光盘(sh)没有得ȝ上下载,|上q得搜烦(ch)半天Q时间都花在搜烦(ch)软g包了(jin)。而且q
扑ֈq些软g包,q可能会(x)遇到的问题是QsoftC2软g包必dsoftC1软g包之前安装才可以Q顺序错?jin)也安装不成功。但q谁知道呢?隑֕。所以,
你没有时间来安装体验软g的功能了(jin)Q更别说开发Y件了(jin)?br> 你安装第2代Linux操作pȝQ典型的是Debian Linux和Ubuntu LinuxQ我之前在文?#8220;如何在安装了(jin)Windows操作pȝ的电(sh)脑上安装Linux操作pȝ”里提C个简明安装手册,你下载来照着操作可以安装Ubuntu?jin)?br>
W?代操作系l在安装软g斚w相当单:(x)W一步,搜烦(ch)你要的YӞ比如你要找一个游戏YӞ它的名称叫mywardQ这个游戏Y件的说明是:(x)my
own war game。搜索这个Y件包只需要输入命令apt-cache search
mywardQ或者输入Y件名U的一部分apt-cache search
warQ或者你不知道Y件名Uͼ输入软g说明里的一部分文字apt-cache search
gameQ都可以扑ֈq个软gQ找到后q行W二步,只需要输入apt-get install mywardQ即后面跟上软g名称可以安装了(jin)?br>