C命令行密码

3

我正在尝试编写一个需要在命令行中输入密码的C程序,例如: ./login password1 如果密码是password1,它会输出一些内容。否则,它会打印另一条信息。这是我现在拥有的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  if (argc < 2) {
    printf("usage: %s <password>\n", argv[0]);
  }
  char pass = "password";
  if (argc == pass) {
    printf("Right\n");
  } else {
    printf("Wrong\n");
  }
}

但它不起作用。


3
学习如何报告问题从不为时过早。它具体是怎么出了问题呢?你看到了哪些症状? - Michael Petrotta
1
这与你所询问的问题无关,但在某些系统(Linux)上,命令行对其他进程是可见的(在/proc/<pid>/cmdline中),因此你不应将命令行参数视为机密。这些信息可能在其他几个系统上也是可用的(不确定)。(我认为这很愚蠢) - nategoose
2个回答

4
char pass = "password";

你正在尝试将一个字符串分配给 `char`。这是不行的!相反,你需要像这样声明 `pass` 为 `char[]`:
char pass[] = "password";

下一个问题:
if(argc == pass)

argc 是传递给你的程序的命令行参数数量(包括作为第一个参数的程序名称)。你需要的是 argv,它包含了实际的参数。具体来说,你可能想要使用 argv[1]

你不能只是写 argv[1] == pass,因为这样比较的是两个字符串的位置。要比较字符串,你需要使用 strcmp()。该函数比较两个字符串,如果它们相等则返回0(现在先不管其中的原因)。前者就像通过检查两个房子是否有完全相同的街道地址来比较它们;后者则像逐块比较房子本身。 (引用自 @caf)

所以这一行变成了:

if (strcmp(argv[1], pass) == 0)

把这些修复方法结合起来,它应该可以正常工作。请改善你的代码缩进,这样不仅可以让别人更容易阅读,而且数周后自己也能受益。

3
指针比较并不是太复杂:argc[1] == pass 比较的是两个字符串的位置; strcmp() 比较的是它们的内容。前者就像通过检查它们是否有完全相同的街道地址来比较两栋房子;后者则像逐一比较每块砖头来比较这些房子。 - caf
@caf +1 很好的解释!我希望你不介意我把它加到我的答案中。如果你介意,随时回滚即可。 - moinudin
@caf: 不,argc[1] 不是字符串的位置。argc 是一个整型变量。argc[1] 没有任何意义的值。argv[1] 才是字符串! - abelenky
1
@abelenky:显然这是一个打字错误(SO已经宣布现在太晚修复了)。 - caf

1

您正在比较argc - 命令行参数的计数 - 与"password"字符串指针。

首先,您需要使用argv[1]而不是argc。您还需要使用适当的strcmp函数来比较指针,而不是只进行指针比较。

最后,通过命令行输入密码通常是不安全的做法,因为存在安全性考虑。在许多系统上,命令行可能会对其他用户可见(例如通过“ps”命令)。


现在不是出于安全原因,我知道如果那样做会存在安全问题。 - Jack Jacobsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接