linux password重定向stdin 【用于在程序中修改系统密码】
2009-07-06 00:24
489 查看
今天 因为项目的需求,希望能通过C程序修改 使用者的密码,而不是通过终端,在GOOGLE了半天后
最开始是希望能找到passwd的源码从而不通过命令调用修改,然而始终是比较困难,后来不知道在哪里找到了对应的源码包【至于在那里找,可自己GOOGLE -_- 】
shadow-4.0.3.tar
可惜修改密码的函数并不好找 'v'
后来偶然发现可从定向passwd的输入:
http://www.lslnet.com/linux/f/docs1/i21/big5196970.htm
但是他上面的程序并不正确:
1、你的程序要有足夠的權限改GUEST的密碼
2、execl之後,你的程序就完全被改了,你應該用fork一個新進程來做這事。
3、既然又FORK,又EXECL,何不popen呢?
不說其他的,就說說execl,你的程序只有execl執行失敗了才會走到下面這裡:
write( from[1], pass, sizeof(pass));
write( from[1], pass, sizeof(pass));
如果execl執行成功write根本走不到
他的代码如下:
根据达人提供的思路
3、既然又FORK,又EXECL,何不popen呢?
我写了代码如下:
注意:起初我忘记了加上/n
而导致修改时候显示是成功的,但是并没有修改对:
[root@Mike /down]# ./pwd
Changing password for user mike.
passwd: all authentication tokens updated successfully.
[root@Mike /down]#
最开始是希望能找到passwd的源码从而不通过命令调用修改,然而始终是比较困难,后来不知道在哪里找到了对应的源码包【至于在那里找,可自己GOOGLE -_- 】
shadow-4.0.3.tar
可惜修改密码的函数并不好找 'v'
后来偶然发现可从定向passwd的输入:
http://www.lslnet.com/linux/f/docs1/i21/big5196970.htm
但是他上面的程序并不正确:
1、你的程序要有足夠的權限改GUEST的密碼
2、execl之後,你的程序就完全被改了,你應該用fork一個新進程來做這事。
3、既然又FORK,又EXECL,何不popen呢?
不說其他的,就說說execl,你的程序只有execl執行失敗了才會走到下面這裡:
write( from[1], pass, sizeof(pass));
write( from[1], pass, sizeof(pass));
如果execl執行成功write根本走不到
他的代码如下:
#include <stdio.h> #include <string.h> #include <unistd.h> int main() { int from[2]; char buf[80]; char pass[] = "0000/n"; char s[] = "hello/n"; pipe( from ); close( from[0] ); dup( 0 ); execl("/bin/passwd", "passwd", "guest", (char *)0); write( from[1], pass, sizeof(pass)); write( from[1], pass, sizeof(pass)); }
根据达人提供的思路
3、既然又FORK,又EXECL,何不popen呢?
我写了代码如下:
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main() { FILE * stream; char user_name[]="mike"; char cmd[50]; char pwd[]="111111/n"; // /n is important //create cmd sprintf(cmd,"/usr/bin/passwd --stdin %s > /dev/null ",user_name); //--stdin:因为passwd(1)默認不允許從stdin輸入口令,必須從終端輸入才行。 stream = popen(cmd, "w" ); //cmd命令的输入来自管道的FILE* stream fwrite(pwd, 1, strlen(pwd), stream); //将pwd中的数据写到FILE *wstream对应的流中,也是写到文件中 fwrite(pwd, 1, strlen(pwd), stream); pclose(stream); }
注意:起初我忘记了加上/n
char pwd[]="111111/n"; // /n is important
而导致修改时候显示是成功的,但是并没有修改对:
[root@Mike /down]# ./pwd
Changing password for user mike.
passwd: all authentication tokens updated successfully.
[root@Mike /down]#
相关文章推荐
- 在Linux系统环境下修改MySQL的root密码
- 远程修改Linux系统VPS服务器Root用户密码教程
- VMware安装的Linux系统忘记密码 怎么修改root密码
- Linux 入门记录:十八、Linux 系统启动流程 + 单用户修改 root 密码 + GRUB 加密
- Linux MySQL修改密码时 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- Linux 入门常用命令 password ― 修改密码,改变用户
- linux 和win7 双系统模式下 忘记win7 密码的修改方法
- 修改linux系统root密码
- linux系统批量修改root用户密码
- 在忘记root密码的情况下如何修改linux系统的root密码
- Linux增强系统安全性:防止单用户模式(single)修改密码
- linux 在程序里修改系统时间
- 单用户模式强制修改Linux系统的密码
- 如何修改Linux系统下的用户密码
- linux系统批量修改root用户密码
- Linux 系统通过WEB修改svn 帐号密码
- 在linux系统上建文件系统,建用户,修改用户所属组,重置用户密码
- Linux 下mysql 忘记root密码,修改密码怎么做?在mysql.user 中并没有password字段,但是有authentication_string
- LINUX下非交互加入root权限用户和修改密码的python小程序
- Azure 国内版 如何用powershell修改linux系统的密码