Cyber​​Ark ITATS004E python 脚本中用户的身份验证失败

CyberArk ITATS004E Authentication failure for User in python script

我正在尝试实现一个 python 脚本,该脚本在远程 Cyber​​Ark 机器上执行本地 bash 脚本或简单命令。这是我的代码:

if __name__ == '__main__':
    for ip in IP_LIST:
        bash_cmd = f"ssh -o stricthostkeychecking=no {USER}%{LOCAL_USER}%{ip}@{PROXY} 'bash -s' < {BASH_SCRIPT}"
        exit_code = subprocess.call(bash_cmd, shell=True)
        print(exit_code)
        bash_cmd = f"scp {USER}%{LOCAL_USER}%{ip}@{PROXY}:server_info_PY.txt ."
        exit_code = subprocess.call(bash_cmd, shell=True)
        print(exit_code)

主要问题是我收到 Cyber​​Ark 身份验证错误 most 次,但并非总是如此,所以它是随机的,我不知道为什么:

PSPSD072E Perform session error occurred. Reason: PSPSD033E Error receiving PSM For SSH server 
response (Extra information: [289E [4426b00e-cc44-11ec-bca1-005056b74f99] Failed to impersonate as 
user <user>. Error: [ITATS004E Authentication failure for User <user>.

在这种情况下,ssh 退出代码是 255,但如果我检查远程计算机上的 sshd 服务日志,则没有错误。我什至尝试使用 os 库来执行 bash 命令,但我得到了相同的结果。
我在考虑多次执行此脚本后挂起多个 ssh 会话,但在远程计算机上我只找到我正在使用的那个。
有人可以解释一下发生了什么,或者您有什么想法吗?

注意: 我没有任何访问 PSM 服务器的权限,它存储在变量 PROXY[=14= 中]

编辑 1: 我尝试使用 Paramiko 库创建 ssh 连接,但我收到与 Paramiko 相关但与 Cyber​​Ark 无关的身份验证错误。我还尝试了基于 Paramiko 的 Fabric 库,但它没有用。
如果我尝试从我的终端手动 运行 相同的 ssh 命令,它可以工作,我可以看到它首先连接到 PROXY,然后连接到 ip 远程机器。从脚本方面看,由于 Cyber​​Ark 身份验证错误,他甚至无法连接到 PROXY

编辑 2: 我在执行 python 脚本时记录了所有命令 运行ning 的一些信息,我发现第一个命令是启动是 /bin/sh/ -c 加上 ssh 字符串:

/bin/sh -c ssh <user>@<domain>

这可能是主要问题吗? /bin/sh -c 的前置?或者这是使用子流程库时的正常行为?有一种方法可以在没有这个前缀的情况下只执行 ssh 命令吗?

编辑 3: 我删除了 shell=True 但遇到了相同的验证错误。因此,如果我手动执行 ssh 命令,我不会出错,但如果它是从 python 脚本执行的,我会收到错误,但我无法使用 [ 在进程级别找到任何矛盾=57=] aux 在这两种情况下。

由于身份验证错误是随机的,我只是添加了一个 while 循环来重置 known_hosts 文件并运行 ssh 命令 n 重试。

succeeded_cmd_exec = False
retries = 5
while not succeeded_cmd_exec:
    if retries == 0:
        break
    bash_cmd = f'ssh-keygen -f "{Configs.KNOWN_HOSTS}" -R "{Configs.PROXY}"'
    _, _, exit_code = exec_cmd(bash_cmd)
    if exit_code == 0:
        radius_password = generate_password(Configs.URI, Configs.PASSWORD)
        bash_cmd = f"sshpass -p \"{radius_password}\" ssh -o stricthostkeychecking=no {Configs.USER}%{Configs.LOCAL_USER}%{ip}@{Configs.PROXY} 'ls'"
        stdout, stderr, exit_code = exec_cmd(bash_cmd)
        if exit_code == 0:
            print('Output from SSH command:\n')
            print(stdout)
            succeeded_cmd_exec = True
        else:
            retries = retries - 1
            print(stdout)
            print('SSH command failed, retrying ... ')
            print('Sleeping 15 seconds')
            time.sleep(15)
    else:
        print('Reset known hosts files failed, retrying ...')
if retries == 0 and not succeeded_cmd_exec:
    print(f'Failed processing IP {ip}')

exec_cmd函数定义如下:

def exec_cmd(bash_cmd: str):
    process = subprocess.Popen(bash_cmd, shell=True, executable='/bin/bash', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    process.wait()
    return stdout.decode('utf-8'), stderr.decode('utf-8'), process.returncode