Linux C++ 检测用户 shell(csh、bash 等)
Linux C++ Detect user shell (csh,bash,etc)
我有一个 C++ 应用程序需要使用系统调用来执行 shell 特定命令。有没有办法检测用户正在运行哪个shell? (Csh/Bash/etc).
谢谢
详细说明
我正在尝试使用一些代码,这些代码通过 system
一个 rsh
调用分叉,该调用具有一系列使用 setenv
的命令,但在 bash。我想检测系统是 csh
还是 bash
并相应地重写调用。
不知道这个有没有用
#include <iostream>
#include <cstdlib> /* getenv */
int main ()
{
char* Shell;
Shell = getenv ("SHELL");
if (Shell!=NULL)
std::cout << Shell << std::endl;
return 0;
}
将输出类似于
的内容
/bin/bash
Getenv returns 带有环境变量值的 C 字符串。
我获取 BASH_VERSION/ZSH_VERSION/... 环境变量失败,因为它们没有导出到子进程; /etc/passwd 提供登录 shell,因此我找到的获取当前 shell 的唯一方法是:
const char* get_process_name_by_pid(const int pid)
{
char* name = (char*)calloc(256,sizeof(char));
if(name){
sprintf(name, "/proc/%d/cmdline",pid);
FILE* f = fopen(name,"r");
if(f){
size_t size = fread(name, sizeof(char), 256, f);
if(size>0){
if('\n'==name[size-1])
name[size-1]='[=10=]';
}
fclose(f);
}
}
return name;
}
bool isZshParentShell() {
pid_t parentPid=getppid();
const char* cmdline=get_process_name_by_pid(parentPid);
return cmdline && strstr(cmdline, "zsh");
}
获取 geteuid
, get the user database entry for that ID getpwuid
包含 shell 的用户 ID,并且 不能 被释放。所以它分解为
getpwuid(geteuid())->pw_shell
最小工作示例:
#include <pwd.h>
#include <unistd.h>
#include <stdio.h>
int main (int argc, const char* argv[]) {
printf("%s\n", getpwuid(geteuid())->pw_shell);
return 0;
}
我有一个 C++ 应用程序需要使用系统调用来执行 shell 特定命令。有没有办法检测用户正在运行哪个shell? (Csh/Bash/etc).
谢谢
详细说明
我正在尝试使用一些代码,这些代码通过 system
一个 rsh
调用分叉,该调用具有一系列使用 setenv
的命令,但在 bash。我想检测系统是 csh
还是 bash
并相应地重写调用。
不知道这个有没有用
#include <iostream>
#include <cstdlib> /* getenv */
int main ()
{
char* Shell;
Shell = getenv ("SHELL");
if (Shell!=NULL)
std::cout << Shell << std::endl;
return 0;
}
将输出类似于
的内容/bin/bash
Getenv returns 带有环境变量值的 C 字符串。
我获取 BASH_VERSION/ZSH_VERSION/... 环境变量失败,因为它们没有导出到子进程; /etc/passwd 提供登录 shell,因此我找到的获取当前 shell 的唯一方法是:
const char* get_process_name_by_pid(const int pid)
{
char* name = (char*)calloc(256,sizeof(char));
if(name){
sprintf(name, "/proc/%d/cmdline",pid);
FILE* f = fopen(name,"r");
if(f){
size_t size = fread(name, sizeof(char), 256, f);
if(size>0){
if('\n'==name[size-1])
name[size-1]='[=10=]';
}
fclose(f);
}
}
return name;
}
bool isZshParentShell() {
pid_t parentPid=getppid();
const char* cmdline=get_process_name_by_pid(parentPid);
return cmdline && strstr(cmdline, "zsh");
}
获取 geteuid
, get the user database entry for that ID getpwuid
包含 shell 的用户 ID,并且 不能 被释放。所以它分解为
getpwuid(geteuid())->pw_shell
最小工作示例:
#include <pwd.h>
#include <unistd.h>
#include <stdio.h>
int main (int argc, const char* argv[]) {
printf("%s\n", getpwuid(geteuid())->pw_shell);
return 0;
}