在LoadRunner中使用popen执行Unix ls命令失败的技术咨询
我来帮你排查这个问题——你已经成功通过plink登录远程服务器,但追加ls命令后却无法获取输出,这大概率是命令传递格式或输出捕获的问题,下面是具体的分析和解决办法:
问题根源分析
步骤1中你直接调用plink登录能拿到输出,说明plink的路径、登录凭证、服务器地址都是没问题的。但步骤2直接把ls追加到命令末尾时,可能遇到了这几个问题:
- LoadRunner的C脚本中,字符串的特殊字符(比如空格、命令参数)可能需要转义
- plink执行远程命令时,需要确保命令被正确传递到远程端执行
- 默认的
popen只会捕获标准输出(stdout),如果远程命令执行出错,错误信息在标准错误(stderr)里你看不到
具体解决办法
1. 正确转义远程命令的引号
在LoadRunner的C代码中,如果你要给plink传递远程命令,最好用双引号把命令包裹起来,同时注意转义双引号(因为C语言里双引号需要用\转义)。修改后的代码如下:
FILE *fp = popen("plink.exe -ssh -l username -pw password Servername \"ls\"", "r");
这样plink能明确识别出ls是要在远程服务器执行的命令,而不是本地的参数。
2. 捕获错误输出排查问题
如果还是没有输出,建议把远程命令的错误输出重定向到标准输出,这样你就能看到具体的错误信息了。修改命令如下:
FILE *fp = popen("plink.exe -ssh -l username -pw password Servername ls 2>&1", "r");
2>&1是重定向语法,把stderr(文件描述符2)的内容重定向到stdout(文件描述符1),这样你通过popen读取的内容就包含错误信息,能帮你定位是权限问题、命令不存在还是其他错误。
3. 使用plink的绝对路径
LoadRunner脚本运行时的工作目录可能不是plink.exe所在的目录,导致找不到plink程序。建议直接写plink的绝对路径,比如:
FILE *fp = popen("C:\\Program Files\\PuTTY\\plink.exe -ssh -l username -pw password Servername \"ls\"", "r");
注意Windows路径里的反斜杠需要用\\转义。
4. 先在本地命令行验证命令可行性
先在本地Windows命令行里执行同样的plink命令,确认能正常输出ls的结果:
plink.exe -ssh -l username -pw password Servername ls
如果本地命令行能正常运行,再把命令复制到LoadRunner脚本中(注意转义特殊字符),这样能排除LoadRunner环境外的问题。
测试建议
修改代码后,记得用fgets等函数读取popen返回的文件指针内容,比如:
char buffer[1024]; while (fgets(buffer, sizeof(buffer), fp) != NULL) { lr_output_message("Remote output: %s", buffer); } pclose(fp);
这样能把远程输出打印到LoadRunner的日志里,方便你验证结果。
内容的提问来源于stack exchange,提问作者user4021949

