[实践OK]无论在root用户下面依然是xiangdong用户提交git,git push均以xiangdong用户提交小工具,防止误以root用户提交。周边知识之C语言getcwd()函数:取得当前的工作目录,获取被执行程序的绝对目录,
背景:Git分不同角色在提交时,root提交时是administrator(Crontab用来Pull一些Ansible脚本到本地), 而xiangdong提交时是xiangdong,往往容易出现一个问题是不小心给root了,这块一是xiangdong上去有时权限不够可能切换为root了,另一个是登录时可能就是Root用户,一提交就成Admin了。鉴于此,自己整个C代码实现提交判断,这样接管了git push,从而对粗心的我来讲起到一个助理的作用。
一、搞这玩意儿的原因:
root情况:
xiangdong:
解决一个无论是root还是xiangdong的环境下,只需要执行下面我们搞的这个c语言生成的二进制文件就能一直只以向东的用户进行提交git,看起来扯淡,但还是有点用的,敲啥呢: gitpush ,和git push只是没有那个空格了。经实践证明是可行的,如下:
二、生产这个玩意的过程:
源码及Makefile和生成的二进制文件路径:
Makefile文件内容:
cat Makefile
源代码:cat gitpush.c
最后,PATH路径:
cat /etc/profile.d/gitpush.sh
三、验证步骤阶段:
root下执行情况:
#gitpush
#gitpush
当前登陆的用户名为:root
current working directory : /home/xiangdong/shell
The UID is 0
The login name is xiangdong
The forbidlogin name is root
请小心,你现在正在Root环境下面,不过没关系,我给你切换到xiangdong用户并作提交。执行git push命令:/usr/bin/sudo -i -u xiangdong -H cd /home/xiangdong/shell && git push
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 288 bytes, done.
Total 3 (delta 1), reused 1 (delta 0)
To git@gitlab.qr.justwinit.net:levooops/shell.git
bd83c51..b400811 master -> master
xiangdong下面执行情况:
$gitpush
执行:cd /home/xiangdong/shell && git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 277 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@gitlab.qr.justwinit.net:levooops/shell.git
b400811..0b19550 master -> master
成功Log:
$git log
commit 0b195507efa6278774d4f500a7086003d6744684
Author: xiangdong <xiangdong@justwinit.cn>
Date: Sun Oct 1 23:15:32 2017 +0800
加上README.md
commit b40081190bf020d49375a4117a181f00ea0a2503
Author: xiangdong <xiangdong@justwinit.cn>
Date: Sun Oct 1 23:09:58 2017 +0800
加上README.md
================================================================================
附录:
为什么 sudo cd 会报错 command not found:
https://www.starduster.me/2015/09/12/why-command-not-found-when-sudo-cd/
相关函数:get_current_dir_name, getwd, chdir
头文件:#include <unistd.h>
定义函数:char * getcwd(char * buf, size_t size);
函数说明:getcwd()会将当前的工作目录绝对路径复制到参数buf 所指的内存空间,参数size 为buf 的空间大小。
注:
1、在调用此函数时,buf 所指的内存空间要足够大。若工作目录绝对路径的字符串长度超过参数size 大小,则返回NULL,errno 的值则为ERANGE。
2、倘若参数buf 为NULL,getcwd()会依参数size 的大小自动配置内存(使用malloc()),如果参数size 也为0,则getcwd()会依工作目录绝对路径的字符串程度来决定所配置的内存大小,进程可以在使用完次字符串后利用free()来释放此空间。
返回值:执行成功则将结果复制到参数buf 所指的内存空间, 或是返回自动配置的字符串指针. 失败返回NULL,错误代码存于errno.
范例
执行:
current working directory :/tmp
cat test_processname.cpp
g++ test_processname.cpp -o gitpush
mv /tmp/gp /usr/local/gitpush/gitpush
cat /etc/profile.d/gp.sh
export PATH=$PATH:/usr/local/gitpush
#gp
directory:/usr/local/gitpush/
processname:gp
current working directory : /root
./gitpush
directory:/tmp/
processname:gitpush
current working directory : /tmp
The UID is 0
The login name is xiangdong
一、搞这玩意儿的原因:
root情况:
xiangdong:
解决一个无论是root还是xiangdong的环境下,只需要执行下面我们搞的这个c语言生成的二进制文件就能一直只以向东的用户进行提交git,看起来扯淡,但还是有点用的,敲啥呢: gitpush ,和git push只是没有那个空格了。经实践证明是可行的,如下:
二、生产这个玩意的过程:
源码及Makefile和生成的二进制文件路径:
Makefile文件内容:
cat Makefile
源代码:cat gitpush.c
最后,PATH路径:
cat /etc/profile.d/gitpush.sh
三、验证步骤阶段:
root下执行情况:
#gitpush
#gitpush
当前登陆的用户名为:root
current working directory : /home/xiangdong/shell
The UID is 0
The login name is xiangdong
The forbidlogin name is root
请小心,你现在正在Root环境下面,不过没关系,我给你切换到xiangdong用户并作提交。执行git push命令:/usr/bin/sudo -i -u xiangdong -H cd /home/xiangdong/shell && git push
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 288 bytes, done.
Total 3 (delta 1), reused 1 (delta 0)
To git@gitlab.qr.justwinit.net:levooops/shell.git
bd83c51..b400811 master -> master
xiangdong下面执行情况:
$gitpush
执行:cd /home/xiangdong/shell && git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 277 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@gitlab.qr.justwinit.net:levooops/shell.git
b400811..0b19550 master -> master
成功Log:
$git log
commit 0b195507efa6278774d4f500a7086003d6744684
Author: xiangdong <xiangdong@justwinit.cn>
Date: Sun Oct 1 23:15:32 2017 +0800
加上README.md
commit b40081190bf020d49375a4117a181f00ea0a2503
Author: xiangdong <xiangdong@justwinit.cn>
Date: Sun Oct 1 23:09:58 2017 +0800
加上README.md
================================================================================
附录:
为什么 sudo cd 会报错 command not found:
https://www.starduster.me/2015/09/12/why-command-not-found-when-sudo-cd/
相关函数:get_current_dir_name, getwd, chdir
头文件:#include <unistd.h>
定义函数:char * getcwd(char * buf, size_t size);
函数说明:getcwd()会将当前的工作目录绝对路径复制到参数buf 所指的内存空间,参数size 为buf 的空间大小。
注:
1、在调用此函数时,buf 所指的内存空间要足够大。若工作目录绝对路径的字符串长度超过参数size 大小,则返回NULL,errno 的值则为ERANGE。
2、倘若参数buf 为NULL,getcwd()会依参数size 的大小自动配置内存(使用malloc()),如果参数size 也为0,则getcwd()会依工作目录绝对路径的字符串程度来决定所配置的内存大小,进程可以在使用完次字符串后利用free()来释放此空间。
返回值:执行成功则将结果复制到参数buf 所指的内存空间, 或是返回自动配置的字符串指针. 失败返回NULL,错误代码存于errno.
范例
执行:
current working directory :/tmp
cat test_processname.cpp
g++ test_processname.cpp -o gitpush
mv /tmp/gp /usr/local/gitpush/gitpush
cat /etc/profile.d/gp.sh
export PATH=$PATH:/usr/local/gitpush
#gp
directory:/usr/local/gitpush/
processname:gp
current working directory : /root
./gitpush
directory:/tmp/
processname:gitpush
current working directory : /tmp
The UID is 0
The login name is xiangdong
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/9476/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2019-1-13 20:53
评论列表