Your IP : 3.144.98.252


Current Path : /opt/webdir/bin/
Upload File :
Current File : //opt/webdir/bin/ssh_keycopy

#!/usr/bin/expect -f
#
# performs copy ssh key to the server via ssh-copy-id
# ksh770, 04/02/14

set timeout 15
# ip address or hostname
set server [lindex $argv 0]
# port on the server
set port [lindex $argv 1]
# user login or root like default
set user [lindex $argv 2]
# ssh key
set sshkey [lindex $argv 3]
# ssh passwd
set sshpass [lindex $argv 4]
# ssh key secure
#set sshsec [lindex $argv 5]

# prompt string
set prompt "\[>%\\$#\] "
#catch {set prompt $env(EXPECT_PROMPT)}

# log output to user or not
# 1 - see all login process
# 0 - no outputs
log_user 0

# print help message
if {[llength $argv] == 0} {
  send_user "Usage: ssh_keycopy server port user sshkey sshpasswd\n"
  exit 1
}

# output into log file
set logfile "/opt/webdir/logs/ssh_keycopy.log"
set statusfile "/opt/webdir/logs/ssh_keycopy.status"

# log process to file
set LOG [open $logfile a+]

# date
set DATE [exec date +%m-%d-%y_%H:%M:%S]
 
if { $port == "" }  { set port "22" }
if { $user == "" }  { set user "root" }

# get info from file
puts $LOG "$DATE: SSH_INIT - get key text from file"
set SSH [open $sshkey]
set sshdata [read -nonewline $SSH]
close $SSH

# test ssh connection
#spawn ssh -p $port -l $user -i $sshsec $server
# expect password - then install new key
# shell -  key installed - return error

puts $LOG "$DATE: SSH_INIT - $user connect to $server:$port"
# run the ssh util
spawn ssh -p $port -l $user $server "mkdir -m 700 ./.ssh/ 2>/dev/null; echo \"$sshdata\" >> ./.ssh/authorized_keys && echo \"KEY_INSTALLED\""
 
# expect - get data from spawn process and run some actions
# password is expered, we have to changed it after login
# Your password has expired
expect {
  timeout {
    puts $LOG "$DATE: SSH_CONNECT - SSH failure for $server:$port"
    exit 100
  }
  "assword has expired" {
    puts $LOG "$DATE: SSH_CONNECT - password has expired $server:$port for $user"
    exit 101
  }
  "No route to host" {
    puts $LOG "$DATE: SSH_CONNECT - No route to host $server:$port"
    exit 105
  }
  "not resolve hostname" {
    puts $LOG "$DATE: SSH_CONNECT - Could not resolve hostname $server:$port"
    exit 106
  }
  "KEY_INSTALLED" {
    puts $LOG "$DATE: SSH_CONNECT - key installed $sshkey, it seems that it is dublicated"
    exit 0
  }
  eof {
    puts $LOG "$DATE: SSH_CONNECT - SSH eof failure for $server:$port"
    exit 102
  }
  # add host key to ~/.ssh/known_hosts
  # Are you sure you want to continue connecting (yes/no)? yes
  "(yes/no)? " { 
    send "yes\n"
    puts $LOG "$DATE: SSH_CONNECT - adding host key to known_hosts file"
    exp_continue
  }
  # user password detect
  # tuser@vm2's password: 
  "assword:" { 
    puts $LOG "$DATE: SSH_CONNECT -  password prompt detected - input it"
    send "$sshpass\n" 
    expect {
      # entering the old password for confirmation
      " UNIX password:" {
        puts $LOG "$DATE: SSH_PASSWORD -  $user must change password - exit. Other script change password and it need additional options"
        exit 103
      }
      -re "$prompt" { puts $LOG "$DATE: SSH_PASSWORD -  detected shell command prompt. Key is installed" }
      -re "Enter selection:" { puts $LOG "$DATE: SSH_PASSWORD - detected bitrix menu command prompt. Key is installed" }
      "KEY_INSTALLED" { puts $LOG "$DATE: SSH_PASSWORD - key $sshkey installed" }
      "assword has expired" { puts $LOG "$DATE: SSH_PASSWORD - password has expired $server:$port for $user"; exit 101 }
      "Permission denied" { puts $LOG "$DATE: SSH_PASSWORD - the server $server:$port doesn't accept user $user"; exit 104 }
    }
  }
  -re "$prompt" { puts $LOG "$DATE: SSH_CONNECT - detected shell command prompt. Key is installed" }
  -re "Enter selection:" { puts $LOG "$DATE: SSH_CONNECT - detected bitrix menu command prompt. Key is installed" }

}

exit 0