预期:“缺少大括号”并发送命令失败

问题描述

我正在尝试运行一个SSH到另一个本地设备的期望脚本,以安装并运行 python 脚本。 所有变量都在脚本之外定义:

set prompt "$SSHuser@$SSHname:~$"
spawn ssh -o \"StrictHostKeyChecking no\" $SSHuser@$SSHhost
expect
{
  "*assword"
  {
    send "$SSHpassword\r"
    exp_continue
  }
  "$prompt"
  {
    send "sudo su"
    expect
    {
      "*assword"
      {
        send "$SSHpassword\r"
        exp_continue
      }
      "$prompt"
      {
        send "apt update && apt upgrade -y && apt install net-tools -y && apt install python3-pip -y"
        expect "$prompt"
        {
        send "wget -O script.py https://SOMEURL"
        }
      }
    }
  }
}

但是,我不断收到以下输出/错误

missing close-brace
    while executing
"{"
Couldn't read file "sur
    expect
    {
      *assword
      {
        send REDACTEDPASSWORD
        exp_continue
      }
      
      {
        send -- apt": no such file or directory
spawn ssh -o StrictHostKeyChecking no USERNAME@192.168.1.173
USERNAME@192.168.1.173's password: 

我已经计算了方括号并使用了突出显示工具,但看不到任何遗漏的方括号。 我也不明白为什么它总是将“ send ”和“ sudo su \ r ”读为“ sur”。 我的期望值仍然很有限。 在理解这里出了什么问题方面,我将不胜感激。

解决方法

Tcl强制您使用the "one true brace style",因为换行符是命令终止符。

作为注释,期望代码不必如此深入地嵌套。该代码可以写为

   jest.mock('fs');
   jest.mock('axios');
   jest.mock('./resource.util')

// ... other code ...

    it('fetches successfully data from an URL',async () => {
        const data = { status: 200,data: { pipe: () => 'data' } };

        axios.mockImplementationOnce(() => data);
        fs.createWriteStream.mockImplementationOnce(() => 'fs');
        handleWriter.mockImplementationOnce(() => 'data'); //handle writer was extracted to a util file
        const expectedJson = await downloadMtgJson();
        expect(expectedJson).toEqual('data');
        expect(axios).toHaveBeenCalledWith(
            expect.objectContaining({ URL: 'https://unsplash.com/photos/AaEQmoufHLk/download?force=true' }),);
        expect(axios).toHaveBeenCalledWith(
            expect.objectContaining({ responseType: 'stream' }),);
    });

本质上,每次生成或发送都应带有期望。