我的unix系统上的目录中有n个文件.有没有办法编写一个shellcript,将所有这些文件通过scp传输到指定的远程系统.我将在脚本中指定密码,这样我就不必为每个文件输入密码.
Pra*_*ati 85
而不是在shell脚本中硬编码密码,使用SSH密钥,它更容易和安全.
$ scp -i ~/.ssh/id_rsa devops@myserver.org:/path/to/bin/*.derp .
Run Code Online (Sandbox Code Playgroud)
假设您的私钥是 ~/.ssh/id_rsa
要生成公钥/私钥对:
$ ssh-keygen -t rsa
Run Code Online (Sandbox Code Playgroud)
以上将生成2个文件,~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)
设置SSH密钥以供使用(一次性任务):复制内容~/.ssh/id_rsa.pub并粘贴~devops/.ssh/authorized_keys到myserver.org服务器的新行中.如果~devops/.ssh/authorized_keys不存在,请随意创建它.
一个清晰的操作指南,请点击这里.
Joh*_*hnA 41
#!/usr/bin/expect -f
# connect via scp
spawn scp "user@example.com:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "PASSWORD\r"
}
}
interact
Run Code Online (Sandbox Code Playgroud)
http://blogs.oracle.com/SanthoshK/entry/automate_linux_scp_command
bsi*_*sco 16
你也可以使用rsync.对于多个文件似乎比scp恕我直言更好.
rsync -avzh /path/to/dir/ user@remote:/path/to/remote/dir/
更新
您可以通过添加'-e'开关来通过ssh使用rsync:
rsync -avzh -e ssh /path/do/dir/ user@remote:/path/to/remote/dir/
Vee*_*dra 16
你为什么不试试这个?
password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
Run Code Online (Sandbox Code Playgroud)
小智 9
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
Run Code Online (Sandbox Code Playgroud)
小智 5
通配符或多个文件怎么样?
scp file1 file2 more-files* user@remote:/some/dir/
Run Code Online (Sandbox Code Playgroud)
小智 5
rsync 是一个程序,其行为方式与 rcp 大致相同,但具有更多选项,并使用 rsync 远程更新协议在更新目标文件时大大加快文件传输速度。
rsync 远程更新协议允许 rsync 仅通过网络连接传输两组文件之间的差异,使用此包随附的技术报告中描述的高效校验和搜索算法。
#!/usr/bin/expect -f
spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/
expect "password:"
send "cool\r"
expect "*\r"
expect "\r"
Run Code Online (Sandbox Code Playgroud)
如果您同意每次运行脚本时输入一次密码,则可以使用 SSH 主连接轻松完成此操作。
#!/usr/bin/env bash
USER_AT_HOST="user@host" # use "$1@$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_HOST"
# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST"
# These do not prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy
# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world"
# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST"
Run Code Online (Sandbox Code Playgroud)