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 字符串。

Link:http://www.cplusplus.com/reference/cstdlib/getenv/

我获取 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;
}