使用expect脚本通过scp登录远程主机

时间:2014-10-13 02:34:35

标签: shell automation expect scp

我想通过使用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

我不知道这些组件的缺失点是什么。

1 个答案:

答案 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。

相关问题