Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用expect脚本通过scp登录到远程主机_Shell_Automation_Expect_Scp - Fatal编程技术网

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

Shell 使用expect脚本通过scp登录到远程主机,shell,automation,expect,scp,Shell,Automation,Expect,Scp,我想通过使用SCP plus向多台机器发送一个文件,并期望为每个连接执行自动密码提示 我有3个组件:(1)文本文件包含用户名、密码、IP和路径;(2) 文本读取器从文本文件中读取信息,并将这些值传递给SCP文件;(3) SCP文件 它应该可以与这些组件一起正常工作,但是当我执行时,仍然会显示密码提示。我已经在SCP文件中尝试了手动值配置,它可以工作,但不适用于值传递 文本文件包含多行文本,如 xxx.xxx.xxx.xxx,user,password,/path/to/directory 文本

我想通过使用SCP plus向多台机器发送一个文件,并期望为每个连接执行自动密码提示

我有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

我不知道这些组件缺少什么

我认为scp有专门的代码来阻止人们做这种事情

密码是给人的。计算机的等价物是“ssh密钥”

您可以使用ssh-keygen创建一个ssh密钥(适用于scp),并通过
scp-i
使用它

您需要在服务器上的
~/.ssh/authorized_keys
中添加公钥-您还可以在此文件中精确控制允许对任何给定密钥运行哪些命令,从而进一步提高安全性


请参阅-虽然这是针对ArchLinux的页面,但它也适用于其他Linux。

您可以尝试启用调试并查看吗?脚本是否将“是”发送到scp?请尝试顶部的
expect-xvf
,查看是否获得调试/跟踪输出。然后您应该看到传入的所有变量及其执行情况。另外,您是否
chmod 755./scp.sh
。脚本需要标记为可执行,以便shell知道可以运行它们。祝你好运