最近在學(xué)習(xí)容器時,遇到了以下幾個系統(tǒng)調(diào)用遏餐,遂作個記錄
- chdir:更改工作目錄
- chroot:更改root目錄
chdir
#include <unistd.h>
int chdir(const char *path);
示例
chdir將當(dāng)前目錄改為當(dāng)前目錄下的test目錄,而fork出的子程序也繼承了這個目錄
/* chdir.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
pid_t pid;
if(chdir("./test") != 0) {
printf("chdir error\n");
}
pid = fork();
if(pid == 0) {
printf("Child dir: %s\n", get_current_dir_name());
}else {
printf("Parent dir: %s\n", get_current_dir_name());
}
return 0;
}
chroot
每一個進(jìn)程都有一個根目錄伦腐,一般是對應(yīng)文件系統(tǒng)的真實根目錄,且每個進(jìn)程都會繼承其父進(jìn)程的根目錄失都“啬ⅲ可以通過chroot()
來改變一個進(jìn)程的根目錄幸冻。此后,所有絕對路徑的解釋都將從該目錄開始(即假裝自己是那個/
)咳焚。chroot()
并不改變當(dāng)前工作目錄洽损。
#include <unistd.h>
int chroot(const char *path);
chroot()
必須與chdir()
一同使用,否則程序?qū)⒂锌赡芡ㄟ^使用相對路徑來進(jìn)行“越獄”革半。為避免“越獄”情況的發(fā)生碑定,同時還應(yīng)該將程序中之前打開的“獄外”文件都關(guān)閉,因為使用fchdir()
可以通過之前打開的文件描述符而達(dá)到越獄的目的又官。
示例
/* chroot.c */
#include <stdio.h>
#include <unistd.h>
int main(void)
{
FILE *f;
/*
* Or:
* chdir("./jail");
* chroot("./");
*/
if(chroot("./jail") != 0) {
perror("chroot() error");
}
if(chdir("/") != 0) {
perror("chdir() error");
}
/* do something after chrooting */
f = fopen("/in_jail.txt", "r");
if(f == NULL) {
perror("/in_jail.txt error");
}else {
char buf[100];
while(fgets(buf, sizeof(buf), f)) {
printf("%s\n", buf);
}
}
return 0;
}
我的目錄結(jié)構(gòu):
.
|-- chroot.c
|-- chroot.o
|-- out_of_jail.txt
`-- jail
`-- in_jail.txt
再看一個越獄的例子:
/* chroot_breaking_out_jial.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
int f1;
FILE *f2;
f1 = open("/", O_RDONLY);
if(chroot("./test") != 0) {
perror("chroot() error");
}
if(chdir("/") != 0) {
perror("chdir() error");
}
/* close(f1); */
/* Breaking out the jail */
fchdir(f1);
chroot(".");
printf("%s\n", get_current_dir_name());
f2 = fopen("/root/WORK/out_of_jail.txt", "r");
if(f2 == NULL) {
perror("out_of_jail_txt error");
}else {
char buf[100];
while(fgets(buf, sizeof(buf), f2)) {
printf("%s\n", buf);
}
}
return 0;
}