我的Qt应用程序中的ssh有问题。我需要运行一个删除远程服务器上的文件的命令。我试图使用QProcess类来实现它。所以我通过" ssh"作为命令的名称和必要的args。通常它看起来像这样:
QStringList params;
params.append(" user@" + ::host +
" \"rm /tmp/" + ::fileName + "\"");
d->impDelProcess->start("ssh", params);
但毕竟它不断询问密码,虽然我生成了ssh密钥并将公钥复制到远程服务器。而且,当我在终端上运行上面的命令时:
ssh user@host "rm /path/fileName"
它完美无缺。该文件已删除,未提出密码。所以,问题在于QProcess中的问题。有办法摆脱问密码吗?谢谢!
答案 0 :(得分:5)
当您使用字符串列表时,这些是单独的参数。试试这个:
params.append("user@" + ::host");
params.append("rm /tmp/" + ::fileName);
这将使Qt为ssh,登录字符串和在远程主机上执行的命令传递两个参数。
重要说明!以上假设::filename
不包含空格或其他任何令人讨厌的内容!你可以用这个来解决空间:
params.append("rm '/tmp/" + ::fileName + "'");
但它无法帮助对抗外卡或..
的路径...想象一下,如果文件名是../home/user/*
例如...那么这是更好的可信输入,或者你需要消毒它(但这超出了这个答案的范围)。
你在问题代码中做的是构造一个参数,相当于这个shell命令行:
ssh 'user@host "rm /path/filename"'