sshpass -e
时间: 2023-12-02 09:35:07 浏览: 9
sshpass -e是一个命令行工具,用于在非交互式的登录过程中免输密码执行命令。它支持从文件中导入密码或者从环境变量中获取密码。使用sshpass -e命令时,可以通过-o StrictHostKeyChecking=no选项来忽略RSA key检查的提示。这个工具可以用于自动化脚本中,以便无需手动输入密码进行登录。
相关问题
for ((i=7;i<=7;i++)) do for ((j=1;j<=8;j++)) do if [ $j -eq 1 || $j -eq 3 || $j -eq 4 ] then sshpass -p bjtungirc scp /home/sinet/lt/dataset/202204130($i)00/h($j).pcap sinet@192.168.199.166:/home/sinet/lt/dataset/202204130($i)00/ sshpass -p bjtungirc scp /home/sinet/lt/dataset/202204130($i)15/h($j).pcap sinet@192.168.199.166:/home/sinet/lt/dataset/202204130($i)15/ elif [ $j -eq 2 || $j -eq 5 || $j -eq 7 ] then sshpass -p bjtungirc scp /home/sinet/lt/dataset/202204130($i)00/h($j).pcap sinet@192.168.199.168:/home/sinet/lt/dataset/202204130($i)00/ sshpass -p bjtungirc scp /home/sinet/lt/dataset/202204130($i)15/h($j).pcap sinet@192.168.199.168:/home/sinet/lt/dataset/202204130($i)15/ fi done done 这一段sh代码出错了,帮我改一下
这段代码有几个问题,我来一一指出并进行修改:
1. 变量拼接问题:变量拼接需要用 ${} 包裹变量名,比如 ${i},${j},而不是 ($i),($j)。
2. 逻辑运算符问题:在 Shell 脚本中,逻辑运算符需要用双括号 (( )) 包裹,比如 $j -eq 1 应该改为 (( $j == 1 ))。
3. sshpass 命令问题:sshpass 命令需要指定 -e 参数,才能使用环境变量传递密码。
下面是修改后的代码:
```shell
#!/bin/bash
for ((i=7; i<=7; i++))
do
for ((j=1; j<=8; j++))
do
if (( $j == 1 || $j == 3 || $j == 4 ))
then
sshpass -e -p bjtungirc scp /home/sinet/lt/dataset/202204130${i}00/h${j}.pcap sinet@192.168.199.166:/home/sinet/lt/dataset/202204130${i}00/
sshpass -e -p bjtungirc scp /home/sinet/lt/dataset/202204130${i}15/h${j}.pcap sinet@192.168.199.166:/home/sinet/lt/dataset/202204130${i}15/
elif (( $j == 2 || $j == 5 || $j == 7 ))
then
sshpass -e -p bjtungirc scp /home/sinet/lt/dataset/202204130${i}00/h${j}.pcap sinet@192.168.199.168:/home/sinet/lt/dataset/202204130${i}00/
sshpass -e -p bjtungirc scp /home/sinet/lt/dataset/202204130${i}15/h${j}.pcap sinet@192.168.199.168:/home/sinet/lt/dataset/202204130${i}15/
fi
done
done
```
希望这次修改能够解决你的问题!
for a in ${MASTER_IP_LIST[@]} do echo "==="$a echo -e "${BL}#=====远程连接其他主节点$a" sshpass -p root ssh -Tq -o StrictHostKeyChecking=no root@$a << remotessh for b in ${MASTER_IP_LIST[@]} do echo "+++"$b done done 打印不出来变量b
您的代码中,for 循环语句的语法是正确的,但是在远程登录的 shell 中,shell 脚本和命令的执行环境和当前登录用户的环境是不同的。因此,需要将 $b 作为环境变量传递给远程登录的 shell,才能在远程登录的 shell 中使用。
可以通过在 for 循环外定义一个变量,将 $b 的值存储到这个变量中,然后在远程登录的 shell 中将这个变量作为环境变量进行传递,再在远程登录的 shell 中使用这个环境变量。
例如,修改您的代码如下:
```
#!/bin/bash
MASTER_IP_LIST=("192.168.1.100" "192.168.1.101" "192.168.1.102")
for a in ${MASTER_IP_LIST[@]}
do
echo "==="$a
echo -e "${BL}#=====远程连接其他主节点$a"
sshpass -p root ssh -Tq -o StrictHostKeyChecking=no root@$a << remotessh
for b in ${MASTER_IP_LIST[@]}
do
echo "+++"$b
export REMOTE_B=$b
# 在远程登录的 shell 中使用 REMOTE_B 环境变量
sshpass -p root ssh -Tq -o StrictHostKeyChecking=no root@$b "echo \${REMOTE_B}"
done
remotessh
done
```
在这个修改后的代码中,我们将远程登录的 shell 中需要使用的 $b 的值存储到 REMOTE_B 环境变量中,并在远程登录的 shell 中使用这个环境变量。