shell expect -c "expect 'password:' send " 双引号中的单引号无效
时间: 2024-02-21 13:58:20 浏览: 20
是的,您说得没错。在双引号中使用单引号是无效的,因为单引号在 shell 中是一个特殊字符,表示一个字符串的开始和结束。如果您想在双引号中使用单引号,可以使用转义符号 "\" 来转义单引号。例如,您可以这样写:
```
shell expect -c "expect 'password:' send \'your_password\'"
```
这将在双引号中使用了单引号,并使用转义符号转义了它。
相关问题
linux expect 单引号和双引号
在Linux expect中,单引号和双引号的作用与在bash中是相同的。单引号用于保留字符串中所有特殊字符的字面含义,而双引号用于允许字符串中的某些特殊字符被解释。例如:
- 单引号示例:`expect 'Password:'`
- 双引号示例:`expect "Password: "`
在双引号中,可以用反斜线来转义某些字符,例如:
- `expect "file\\name"`:输出为`file\name`
- `expect "a\"b\"c"`:输出为`a"b"c`
使用这个脚本 #!/usr/bin/expect -f cd /home/111 spawn scp -r * root@10.18.18.1:/data/111 set timeout -1 expect "*password:" send "1111\n" 在执行的时候报错 *: No such file or directory
这个错误是因为在你执行的脚本中,使用了`cd`命令,但是`cd`命令是shell命令,而不是expect命令。因此,你需要将`cd`命令去掉,并使用`set`命令设置当前工作目录。
下面是修改后的脚本:
```bash
#!/usr/bin/expect -f
# 设置工作目录
set workDir /home/111
cd $workDir
# 定义变量
set host "10.18.18.1"
set user "root"
set password "1111"
set localPath "."
set remotePath "/data/111"
# 执行scp
spawn scp -r $localPath $user@$host:$remotePath
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$password\r" }
}
expect "100%"
expect eof
```
在这个脚本中,我们使用`set`命令设置了当前工作目录,然后执行了scp命令,将当前目录下的所有文件和子目录上传到远程主机。我们使用`expect`命令匹配密码输入提示,并发送密码。最后,我们等待文件传输完成,并使用`expect eof`命令关闭连接。
注意,如果你想要上传的是当前目录下的所有文件和子目录,应该将`localPath`设置为`.`,而不是`*`。因为`*`会展开为当前目录下的所有文件和子目录,而不是一个整体的路径。