Files
build.ems/tools/sftp/sftpd
2024-09-27 18:07:48 +08:00

121 lines
3.0 KiB
Plaintext
Executable File

#!/usr/bin/expect -f
#This script interative with the remote server, and send the file to it
set remoteip [ exec cat accout | grep RemoteServerIP | awk -F= "{print \$2}" ]
set username [ exec cat accout | grep LoginUserName | awk -F= "{print \$2}" ]
set userpass [ exec cat accout | grep LoginPassword | awk -F= "{print \$2}" ]
set mode [lindex $argv 0]
if { $mode == "getdir" } {
set remote_dir [lindex $argv 1]
} else {
if { $mode == "putdir" } {
set local_dir [lindex $argv 1]
set remote_dir [lindex $argv 2]
} else {
puts "Usage: ./sftpd getdir remotedir"
puts " ./sftpd putdir localdir remotedir"
puts " ./sftpd getfile remotefile"
puts " ./sftpd putfile localfile remotefile"
exit
}
}
set work_dir [ exec pwd ]
set remote_base_dir [ exec basename $remote_dir ]
proc get_directory {dir} {
# get current local dir
send "lpwd\n"
expect "*sftp>*"
set current_local_dir_str $expect_out(buffer)
set current_local_dir [ exec echo $current_local_dir_str | grep "directory" | awk -F: "{print \$2}" | cut -c2- ]
# get current remote dir
send "pwd\n"
expect "*sftp>*"
set current_remote_dir_str $expect_out(buffer)
set current_remote_dir [ exec echo $current_remote_dir_str | grep "directory" | awk -F: "{print \$2}" | cut -c2- ]
# get remote base dir
set current_remote_base_dir [ exec basename $dir ]
# check the dir whether exist
#set result [ exec ls -l | grep -c "$current_remote_base_dir\$" ]
#if { $result == 1 } {
# send_user "file:$current_remote_base_dir already exist"
# exit
#}
# create the local dir
send "lmkdir $current_remote_base_dir\n"
expect "*sftp>*"
# cd remote dir
send "cd $dir\n"
expect "*sftp>*"
# cd local dir
send "lcd $current_remote_base_dir\n"
expect "*sftp>*"
# list the file in the current remote dir
send "ls -l\n"
expect "*sftp>*"
set fileliststr $expect_out(buffer)
# get remote files
set runcmd [list exec echo $fileliststr | grep "^\[-d\]" | grep "^\[^d\]" | awk "{print \$9}"]
if {[catch $runcmd res]} {
send_user "skip"
} else {
set filelist [ exec echo $fileliststr | grep "^\[-d\]" | grep "^\[^d\]" | awk "{print \$9}" ]
foreach file $filelist {
send "get $file\n"
expect "*sftp>*"
}
}
# process dir
set runcmd [list exec echo $fileliststr | grep "^d" | awk "{print \$9}"]
if {[catch $runcmd res]} {
send_user "skip"
} else {
set dirlist [ exec echo $fileliststr | grep "^d" | awk "{print \$9}" ]
foreach directory $dirlist {
set new_remote_dir [ exec echo $dir/$directory ]
get_directory $new_remote_dir
}
}
send "lcd ..\n"
expect "*sftp>*"
send "cd $current_remote_dir\n"
expect "*sftp>*"
}
set timeout 120
spawn sftp $username@$remoteip
expect "*(yes/no)?" {send "yes\n"; expect "*assword: "} "*assword: "
send "$userpass\n"
expect "*sftp>*"
if { $mode == "getdir" } {
get_directory $remote_dir
} else {
send "$local_dir $remote_dir\n"
expect "*sftp>*"
}
#set value $expect_out(buffer)
#send "$value\n"
#expect "*sftp>*"
exit