我想安装 Discovery Studio Visualizer,但预编译的二进制文件会检查系统的操作系统版本。当它发现我没有运行 RHEL 时,安装程序就会退出。
有没有办法改变或欺骗调用 uname 的程序来显示不同的信息?
答案1
您无法自定义uname
的输出,但您可以通过让系统运行自定义脚本而不是“真正的”脚本来欺骗安装程序/bin/uname
。
首先,您需要检查安装程序正在运行的确切命令来检查您的系统信息;在这个例子中,为了方便起见,我假装一个可执行文件~/tmp/check
正在运行uname -n
,并且的输出uname -n
应该是ubuntu
为了~/tmp/check
打印“通过!”。
~/tmp/check
的来源(这当然是不相关的,只是为了展示测试可执行文件的功能):
#include <stdio.h>
#include <string.h>
#define MAX_STRING_LENGTH 32
int main(void) {
FILE* output = popen("/bin/uname -n", "r");
char expected[] = "ubuntu";
char hostname[MAX_STRING_LENGTH];
fgets(hostname, MAX_STRING_LENGTH, output);
pclose(output);
if(hostname[strlen(hostname) - 1] == '\n')
hostname[strlen(hostname) - 1] = '\0';
if(strcmp(expected, hostname) == 0) {
printf("Passed!\n");
return 0;
}
return 1;
}
user@debian:~/tmp$ uname -n
debian
user@debian:~/tmp$ ./check
user@debian:~/tmp$
使用以下命令可以轻松跟踪可执行文件运行的确切命令strace
:
user@debian:~/tmp$ strace -f ./check 2>&1 > /dev/null | grep execve
execve("./check", ["./check"], [/* 34 vars */]) = 0
[pid 13122] execve("/bin/sh", ["sh", "-c", "/bin/uname -n"], [/* 34 vars */] <unfinished ...>
[pid 13122] <... execve resumed> ) = 0
[pid 13123] execve("/bin/uname", ["/bin/uname", "-n"], [/* 34 vars */]) = 0
因此,为了解决这个问题,应该输出uname -n
:ubuntu
最简单的解决方案就是移动/bin/uname
并创建一个链接/bin/uname
到自定义脚本的符号链接(它将忽略任何参数并只输出ubuntu
):
cat ~/tmp/spoofer.sh
:
#!/bin/bash
echo ubuntu
exit 0
user@debian:~/tmp$ sudo mv /bin/uname /bin/uname1
user@debian:~/tmp$ sudo ln -s ~/tmp/spoofer.sh /bin/uname
让我们看看这是否有效:
user@debian:~/tmp$ uname -n
ubuntu
user@debian:~/tmp$ ./check
Passed!
user@debian:~/tmp$
宾果!(记得随后移除/bin/uname
并移/bin/uname1
回:)/bin/uname
sudo rm /bin/uname && sudo mv /bin/uname1 /bin/uname
答案2
别名 uname'uname \!*|sed s/Ubuntu/RHEL/'
这是 c-shell 格式的别名,您可能需要根据您所使用的 shell 稍微更改一下。