Shell 脚本实现scp 自动化交互

ttgo2 发表了文章 • 0 个评论 • 955 次浏览 • 2018-08-06 18:30 • 来自相关话题

Linux  shell 命令scp 可以实现远程拷贝文件,但是需要人工进行交互,无法使用shell 脚本进行自动化的方式来实现,如果能自动化实现呢? 今天我们来解决这个问题。
 
1、 expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send),以chat的方式解决了交互的问题。
 





2、默认情况下centos 没有安装,可以通过yum 来进行安装,具体命令为:yum install expect  截图如下:






3、 验证一下是否安装expect成功,截图如下






4、举例来说明expect的格式命令和具体的方法
 
step1: 创建一个后缀名为.exp的文件,scp.exp ,具体代码如下
 #!/usr/bin/expect -f
set timeout 10

set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]

#这里的 set 使用来定义位置变量的,执行脚本的时候传入位置变量spawn scp -r $src_file $username@$host:/tmp/$dest_file
expect {
"(yes/no)?" {
send "yes\n"
expect "*assword:" { send "$password\n" }
}
"*assword:" {
send "$password\n"
}
}


expect "100%"
expect eof:


5 执行过程,
 
step1: 脚本的赋值执行权限,chmod +x scp.exp
 
step2: ./scp.exp 192.168.3.129 root 123456 1.txt 1.txt
 





 
  查看全部
Linux  shell 命令scp 可以实现远程拷贝文件,但是需要人工进行交互,无法使用shell 脚本进行自动化的方式来实现,如果能自动化实现呢? 今天我们来解决这个问题。
 
1、 expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send),以chat的方式解决了交互的问题。
 
C1CC1CF7-B617-45dd-BDB2-A55EEB216A35.png


2、默认情况下centos 没有安装,可以通过yum 来进行安装,具体命令为:yum install expect  截图如下:

QQ截图20180808163745.png


3、 验证一下是否安装expect成功,截图如下

QQ截图20180808164710.png


4、举例来说明expect的格式命令和具体的方法
 
step1: 创建一个后缀名为.exp的文件,scp.exp ,具体代码如下
 
#!/usr/bin/expect -f
set timeout 10

set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]

#这里的 set 使用来定义位置变量的,执行脚本的时候传入位置变量
spawn scp -r $src_file $username@$host:/tmp/$dest_file
expect {
"(yes/no)?" {
send "yes\n"
expect "*assword:" { send "$password\n" }
}
"*assword:" {
send "$password\n"
}
}


expect "100%"
expect eof:


5 执行过程,
 
step1: 脚本的赋值执行权限,chmod +x scp.exp
 
step2: ./scp.exp 192.168.3.129 root 123456 1.txt 1.txt
 

QQ截图20180808170100.png

 
 

【Kali Linux网络扫描秘籍系列】Bash脚本+ARPing 实现自动化IP扫描

kakaxi 发表了文章 • 0 个评论 • 940 次浏览 • 2018-05-29 11:27 • 来自相关话题

ARPing简介:
ARPing 是一个命令行网络工具,具有类似于常用的 ping 工具的功能。 此工具可通过提供该 IP 地址作为参数,来识别活动主机是否位于给定 IP 的本地网络上。 这个秘籍将讨论如何使用 ARPing 扫描网络上的活动主机。
 
准备
要使用 ARPing 执行 ARP 发现,你需要在 LAN 上至少拥有一个响应 ARP 请求的系统。本测试在Kali 2.0上进行
 
操作步骤
ARPing是一种工具,可用于发送 ARP 请求并标识主机是否活动和响应。 该工具仅通过将 IP 地址作为参数传递给它来使用:root@kali:~# arping -c 1 172.16.155.1
ARPING 172.16.155.1 from 172.16.155.150 eth0
Unicast reply from 172.16.155.1 [00:50:56:C0:00:08] 1.047ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
root@kali:~#



在所提供的示例中,单个 ARP 请求被发送给广播地址,请求 172.16.155.1 IP地址的物理位置。 如输出所示,主机从 000:50:56:C0:00:08 MAC地址接收到单个应答。 此工具可以更有效地用于第二层上的发现,扫描是否使用 bash 脚本在多个主机上同时执行此操作。 为了测试 bash 中每个实例的响应,我们应该确定响应中包含的唯一字符串,它标识了活动主机,但不包括没有收到响应时的情况。要识别唯一字符串,应该对无响应的 IP 地址进行 ARPing 请求:root@kali:~# arping -c 1 172.16.155.100
ARPING 172.16.155.100 from 172.16.155.150 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s)




通过分析来自成功和失败的不同 ARP 响应,你可能注意到,如果存在所提供的 IP地址的相关活动主机,并且它也在包含在 IP 地址的行内,则响应中存在来自字符串的唯一字节。 通过对此响应执行 grep ,我们可以提取每个响应主机的 IP 地址:root@kali:~# arping -c 1 172.16.155.1 | grep 'reply from'
Unicast reply from 172.16.155.1 [00:50:56:C0:00:08] 0.712ms



我们可以仅仅通过处理提供给 cut 函数的分隔符和字段值,从返回的字符串中轻松地提取 IP 地址:root@kali:~# arping -c 1 172.16.155.1 | grep 'reply from' |cut -d ' ' -f 4
172.16.155.1在识别如何从正面 ARPing 响应中提取 IP 在 bash 脚本中轻易将该任务传递给循环,并输出实时 IP 地址列表。 使用此技术的脚本的示例如下所示:root@kali:~# cat arping.sh 
#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Usage - ./arping.sh [interface]"
    echo "Example - ./arping.sh eth0"
    echo "Example will perform an ARP scan of the local subnet to which eth0 is assigned"
    exit
fi

interface=$1
prefix=$(ifconfig $inerface | grep 'inet'| head -n 1| cut -d ' ' -f 10|cut -d '.' -f 1-3 ) #  由于输出的间隔符空格,因此我这边cut -d后面用的是空格,大家做的过程中,可以根据自己的情况变化

for addr in $(seq 1 254); do 
    arping -c 1 $prefix.$addr | grep 'reply from' |cut -d ' ' -f 4 &
done在提供的 bash 脚本中,第一行定义了 bash 解释器的位置。接下来的代码块执行测试,来确定是否提供了预期的参数。这通过评估提供的参数的数量是否不等于 1来确定。如果未提供预期参数,则输出脚本的用法,并且退出脚本。用法输出表明,脚本预期将本地接口名称作为参数。下一个代码块将提供的参数赋给 interface 变量。然后将接口值提供给 ifconfig ,然后使用输出提取网络前缀。例如,如果提供的接口的 IP 地址是 192.168.11.4 ,则前缀变量将赋为 192.168.11 。然后使用 for 循环遍历最后一个字节的值,来在本地 / 24 网络中生成每个可能的 IP 地址。对于每个可能的 IP 地址,执行单个 arping 命令。然后对每个请求的响应通过管道进行传递,然后使用 grep 来提取带有短语 bytes 的行。如前所述,这只会提取包含活动主机的 IP 地址的行。最后,使用一系列 cut 函数从此输出中提取 IP 地址。请注意,在 for 循环任务的末尾使用 & 符号,而不是分号。符号允许并行执行任务,而不是按顺序执行。这极大地减少了扫描 IP 范围所需的时间。
注意:给文件增加执行权限如下命令集:root@kali:~# chmod +x arping.sh
root@kali:~# ls -al arping.sh
-rwxr-xr-x 1 root root 552 May 28 23:18 arping.sh
root@kali:~#
 
看看下面的执行命令集:root@kali:~# ./arping.sh
Usage - ./arping.sh [interface]
Example - ./arping.sh eth0
Example will perform an ARP scan of the local subnet to which eth0 is assigned
root@kali:~# ./arping.sh eth0
root@kali:~# 172.16.155.1
172.16.155.2
172.16.155.254




可以轻易将脚本的输出重定向到文本文件,然后用于随后的分析。 可以使用尖括号重定向输出,后跟文本文件的名称。 一个例子如下:root@kali:~# ./arping.sh eth0 > output.txt
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.1
172.16.155.2
172.16.155.254
root@kali:~#



一旦输出重定向到输出文件,你就可以使用 ls 命令验证文件是否已写入文件系统,或者可以使用 cat 命令查看文件的内容。 此脚本还可以修改为从输入文件读取,并仅验证此文件中列出的主机是否处于活动状态。 对于以下脚本,你需要拥有IP 地址列表的输入文件。 为此,我们可以使用与上一个秘籍中讨论的 Scapy 脚本所使用的相同的输入文件:#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage - ./arping.sh [interface]"
echo "Example - ./arping.sh eth0"
echo "Example will perform an ARP scan of the local subnet to which eth0 is assigned"
exit
fi

file=$1

for addr in $(cat $file); do
arping -c 1 $addr | grep 'reply from' |cut -d ' ' -f 4 &
done




这个脚本和前一个脚本唯一的主要区别是,并没有提供一个接口名,而是在执行脚本时提供输入列表的文件名。 这个参数被传递给文件变量。 然后, for 循环用于循环遍历此文件中的每个值,来执行 ARPing 任务。 为了执行脚本,请使用句号和斜杠,后跟可执行脚本的名称:root@kali:~# ./arping.sh
Usage - ./arping.sh [interface]
Example - ./arping.sh eth0
Example will perform an ARP scan of the local subnet to which eth0 is assigned
root@kali:~# ./arp.sh output.txt
-bash: ./arp.sh: No such file or directory
root@kali:~#




 工作原理
 
ARPing 是一个工具,用于验证单个主机是否在线。 然而,它的简单用法的使我们很容易操作它在 bash 中按顺序扫描多个主机。 这是通过循环遍历一系列 IP 地址,然后将这些 IP 地址作为参数提供给工具来完成的。
  查看全部
ARPing简介:
ARPing 是一个命令行网络工具,具有类似于常用的 ping 工具的功能。 此工具可通过提供该 IP 地址作为参数,来识别活动主机是否位于给定 IP 的本地网络上。 这个秘籍将讨论如何使用 ARPing 扫描网络上的活动主机。
 
准备
要使用 ARPing 执行 ARP 发现,你需要在 LAN 上至少拥有一个响应 ARP 请求的系统。本测试在Kali 2.0上进行
 
操作步骤
ARPing是一种工具,可用于发送 ARP 请求并标识主机是否活动和响应。 该工具仅通过将 IP 地址作为参数传递给它来使用:
root@kali:~# arping -c 1 172.16.155.1
ARPING 172.16.155.1 from 172.16.155.150 eth0
Unicast reply from 172.16.155.1 [00:50:56:C0:00:08] 1.047ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
root@kali:~#



在所提供的示例中,单个 ARP 请求被发送给广播地址,请求 172.16.155.1 IP地址的物理位置。 如输出所示,主机从 000:50:56:C0:00:08 MAC地址接收到单个应答。 此工具可以更有效地用于第二层上的发现,扫描是否使用 bash 脚本在多个主机上同时执行此操作。 为了测试 bash 中每个实例的响应,我们应该确定响应中包含的唯一字符串,它标识了活动主机,但不包括没有收到响应时的情况。要识别唯一字符串,应该对无响应的 IP 地址进行 ARPing 请求:
root@kali:~# arping -c 1 172.16.155.100
ARPING 172.16.155.100 from 172.16.155.150 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s)




通过分析来自成功和失败的不同 ARP 响应,你可能注意到,如果存在所提供的 IP地址的相关活动主机,并且它也在包含在 IP 地址的行内,则响应中存在来自字符串的唯一字节。 通过对此响应执行 grep ,我们可以提取每个响应主机的 IP 地址:
root@kali:~# arping -c 1 172.16.155.1 | grep 'reply from' 
Unicast reply from 172.16.155.1 [00:50:56:C0:00:08] 0.712ms



我们可以仅仅通过处理提供给 cut 函数的分隔符和字段值,从返回的字符串中轻松地提取 IP 地址:
root@kali:~# arping -c 1 172.16.155.1 | grep 'reply from' |cut -d ' ' -f 4
172.16.155.1
在识别如何从正面 ARPing 响应中提取 IP 在 bash 脚本中轻易将该任务传递给循环,并输出实时 IP 地址列表。 使用此技术的脚本的示例如下所示:
root@kali:~# cat arping.sh 
#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Usage - ./arping.sh [interface]"
    echo "Example - ./arping.sh eth0"
    echo "Example will perform an ARP scan of the local subnet to which eth0 is assigned"
    exit
fi

interface=$1
prefix=$(ifconfig $inerface | grep 'inet'| head -n 1| cut -d ' ' -f 10|cut -d '.' -f 1-3 ) #  由于输出的间隔符空格,因此我这边cut -d后面用的是空格,大家做的过程中,可以根据自己的情况变化

for addr in $(seq 1 254); do 
    arping -c 1 $prefix.$addr | grep 'reply from' |cut -d ' ' -f 4 &
done
在提供的 bash 脚本中,第一行定义了 bash 解释器的位置。接下来的代码块执行测试,来确定是否提供了预期的参数。这通过评估提供的参数的数量是否不等于 1来确定。如果未提供预期参数,则输出脚本的用法,并且退出脚本。用法输出表明,脚本预期将本地接口名称作为参数。下一个代码块将提供的参数赋给 interface 变量。然后将接口值提供给 ifconfig ,然后使用输出提取网络前缀。例如,如果提供的接口的 IP 地址是 192.168.11.4 ,则前缀变量将赋为 192.168.11 。然后使用 for 循环遍历最后一个字节的值,来在本地 / 24 网络中生成每个可能的 IP 地址。对于每个可能的 IP 地址,执行单个 arping 命令。然后对每个请求的响应通过管道进行传递,然后使用 grep 来提取带有短语 bytes 的行。如前所述,这只会提取包含活动主机的 IP 地址的行。最后,使用一系列 cut 函数从此输出中提取 IP 地址。请注意,在 for 循环任务的末尾使用 & 符号,而不是分号。符号允许并行执行任务,而不是按顺序执行。这极大地减少了扫描 IP 范围所需的时间。
注意:给文件增加执行权限如下命令集:
root@kali:~# chmod +x arping.sh
root@kali:~# ls -al arping.sh
-rwxr-xr-x 1 root root 552 May 28 23:18 arping.sh
root@kali:~#

 
看看下面的执行命令集:
root@kali:~# ./arping.sh
Usage - ./arping.sh [interface]
Example - ./arping.sh eth0
Example will perform an ARP scan of the local subnet to which eth0 is assigned
root@kali:~# ./arping.sh eth0
root@kali:~# 172.16.155.1
172.16.155.2
172.16.155.254




可以轻易将脚本的输出重定向到文本文件,然后用于随后的分析。 可以使用尖括号重定向输出,后跟文本文件的名称。 一个例子如下:
root@kali:~# ./arping.sh eth0 > output.txt
root@kali:~# ls output.txt
output.txt
root@kali:~# cat output.txt
172.16.155.1
172.16.155.2
172.16.155.254
root@kali:~#



一旦输出重定向到输出文件,你就可以使用 ls 命令验证文件是否已写入文件系统,或者可以使用 cat 命令查看文件的内容。 此脚本还可以修改为从输入文件读取,并仅验证此文件中列出的主机是否处于活动状态。 对于以下脚本,你需要拥有IP 地址列表的输入文件。 为此,我们可以使用与上一个秘籍中讨论的 Scapy 脚本所使用的相同的输入文件:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage - ./arping.sh [interface]"
echo "Example - ./arping.sh eth0"
echo "Example will perform an ARP scan of the local subnet to which eth0 is assigned"
exit
fi

file=$1

for addr in $(cat $file); do
arping -c 1 $addr | grep 'reply from' |cut -d ' ' -f 4 &
done




这个脚本和前一个脚本唯一的主要区别是,并没有提供一个接口名,而是在执行脚本时提供输入列表的文件名。 这个参数被传递给文件变量。 然后, for 循环用于循环遍历此文件中的每个值,来执行 ARPing 任务。 为了执行脚本,请使用句号和斜杠,后跟可执行脚本的名称:
root@kali:~# ./arping.sh 
Usage - ./arping.sh [interface]
Example - ./arping.sh eth0
Example will perform an ARP scan of the local subnet to which eth0 is assigned
root@kali:~# ./arp.sh output.txt
-bash: ./arp.sh: No such file or directory
root@kali:~#




 工作原理
 
ARPing 是一个工具,用于验证单个主机是否在线。 然而,它的简单用法的使我们很容易操作它在 bash 中按顺序扫描多个主机。 这是通过循环遍历一系列 IP 地址,然后将这些 IP 地址作为参数提供给工具来完成的。