Karate框架下Mac执行SSH命令遇权限及伪终端问题求助
问题描述
在Mac系统中使用Karate框架执行SSH命令ssh test01.dev.test.com时,无法输入密码,出现以下错误输出:
working dir :null Pseudo-terminal will not be allocated because stdin is not a terminal. permission denied please try again
使用的Karate代码片段如下:
def command = """ function(line) { var proc = karate.fork({ redirectErrorStream: false, useShell: true, line: line }); proc.waitSync(); karate.set('sysOut', proc.sysOut); karate.set('sysErr', proc.sysErr); karate.set('exitCode', proc.exitCode); } """ Scenario: command('ssh test01.dev.test.com')
解决方案
1. 修复伪终端分配问题
当前karate.fork未配置伪终端,导致SSH无法进入交互模式。需在fork参数中添加pty: true,模拟终端环境:
def command = """ function(line) { var proc = karate.fork({ redirectErrorStream: false, useShell: true, line: line, pty: true }); proc.waitSync(); karate.set('sysOut', proc.sysOut); karate.set('sysErr', proc.sysErr); karate.set('exitCode', proc.exitCode); } """
2. 解决密码输入交互问题
即使分配了伪终端,Karate的同步waitSync()也无法处理交互式密码输入,推荐两种替代方案:
方案A:使用sshpass自动注入密码
先通过Homebrew安装sshpass:brew install sshpass,然后修改SSH命令为:
sshpass -p '你的目标服务器密码' ssh test01.dev.test.com
直接将该组合命令传入command()函数即可完成自动登录。
方案B:配置SSH密钥登录(推荐)
这是更安全且无需密码交互的方式:
- 生成本地密钥对:
ssh-keygen -t rsa(一路回车即可) - 将公钥复制到目标服务器:
ssh-copy-id test01.dev.test.com
之后执行ssh test01.dev.test.com无需输入密码,可直接登录。
内容的提问来源于stack exchange,提问作者sangam mamadapur
相关产品推荐
相关产品推荐

