我想通过使用SCP plus EXPECT为每个连接发送一个文件到多台机器。
我有3个组件,它们是(1)文本文件包含用户名,密码,IP和路径; (2)文本阅读器从文本文件中读取信息并将这些值传递给SCP文件; (3)SCP档案。
它应该可以正常使用这些组件,但是当我执行时,密码提示仍会显示。我已经尝试手动使用SCP文件中的值配置,但它可以工作,但不能用于传递值。
文本文件包含多行文本,如
xxx.xxx.xxx.xxx,user,password,/path/to/directory
文本阅读器脚本是
#!/bin/bash
cat list.txt | while read line
do
IPADDR=$(echo $line | awk -F',' '{print $1}');
US=$(echo $line | awk -F',' '{print $2}');
PW=$(echo $line | awk -F',' '{print $3}');
dir_path=$(echo $line | awk -F',' '{print $4}');
./scp.sh "${IPADDR}" "${US}" "${PW}" "${dir_path}"
done
并且SCP文件是
#!/usr/bin/expect -f
log_user 1
exp_internal 0
set timeout 30
set HOST [lindex $argv 0]
set US [lindex $argv 1]
set PW [lindex $argv 2]
set DIR [lindex $argv 3]
#connect via scp
spawn scp -r "${US}@{HOST}:/home/test/send_file" ${DIR}/moved_file
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "${PW}\r"
}
}
interact
我不知道这些组件的缺失点是什么。
答案 0 :(得分:1)
我认为scp有专门用来阻止人们做这类事情的代码。
密码适用于人类。计算机的等价物是“ssh键”
您可以使用ssh-keygen创建一个ssh密钥(适用于scp),并通过scp -i <ssh-key-file>
使用它。
您需要在~/.ssh/authorized_keys
中在服务器上添加公钥 - 您还可以在此文件中准确控制允许为任何给定密钥运行的命令,从而进一步提高安全性。
请参阅https://wiki.archlinux.org/index.php/SSH_keys - 虽然这是针对ArchLinux的页面,但它也适用于其他Linux。