Solaris 11 期望已安装 ssh-key 的脚本测试?没有 ssh-copy-id ssh-pass
Solaris 11 Expect script test for ssh-key already installed? WITHOUT ssh-copy-id ssh-pass
我在 Solaris 11.4 服务器上有以下 expect 脚本。由于 Solaris 11 不附带 ssh-copy-id 或 ssh-pass。我想创建一个脚本来自动将我的 ssh 密钥复制到 100 多台服务器。经过一番 Google 期待似乎是唯一的选择 - 除非有人知道得更多?
我可以获得将密钥复制到目标服务器上的脚本,但我需要的是如果密钥已经安装则脚本不要复制。
我可以检查的唯一方法是 ssh 登录是否直接继续而不要求输入密码。我的问题是如何测试空提示? .
如果密钥未安装,我会收到密码提示 - 然后我可以使用 expect 来完成密码并复制密钥。我已经尝试测试“”(空),但这似乎匹配所有内容。非常感谢任何建议。
#!/usr/bin/expect
set timeout 1200
set user [lindex $argv 0]
set host [lindex $argv 1]
set pass [lindex $argv 2]
set sshkeyfile [open ~/.ssh/id_rsa.pub r]
set sshid [read $sshkeyfile]
close $sshkeyfile
spawn ssh $user@$host "mkdir -m 700 ~/.ssh ; echo \" $sshid\" >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys"
expect {
"continue" { send "Yes\n" ; exp_continue }
"Password" { send "$pass\r"; interact}
"" { send "exit\n" ; exit 0 } # Exit if not asked for "continue/Password"
}
这个怎么样:没有命令的ssh;如果看到密码,则设置一个布尔变量;当您点击 shell 提示符时,如果变量为真,则附加到 authorized_keys
#!/usr/bin/expect
set timeout 1200
lassign $argv user host pass
set sshkeyfile [open ~/.ssh/id_rsa.pub r]
set sshid [read -nonewline $sshkeyfile]
close $sshkeyfile
set sentPassword false
set prompt {$ $} ;# shell prompt ends with "dollar space"
spawn ssh $user@$host
expect {
"continue" {
send "Yes\r"
exp_continue
}
"Password" {
set sentPassword true
send "$pass\r"
exp_continue
}
-re $prompt
}
if {$sentPassword} {
send "mkdir -p -m 700 ~/.ssh ; echo \"$sshid\" >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys\r"
expect -re $prompt
}
send "exit\r"
expect eof
其他变化:
lassign
在一个命令中处理命令行参数
read -nonewline
省略 public key 尾随的换行符
mkdir -p
以防止目录已存在时出现错误消息。
我在 Solaris 11.4 服务器上有以下 expect 脚本。由于 Solaris 11 不附带 ssh-copy-id 或 ssh-pass。我想创建一个脚本来自动将我的 ssh 密钥复制到 100 多台服务器。经过一番 Google 期待似乎是唯一的选择 - 除非有人知道得更多?
我可以获得将密钥复制到目标服务器上的脚本,但我需要的是如果密钥已经安装则脚本不要复制。
我可以检查的唯一方法是 ssh 登录是否直接继续而不要求输入密码。我的问题是如何测试空提示? .
如果密钥未安装,我会收到密码提示 - 然后我可以使用 expect 来完成密码并复制密钥。我已经尝试测试“”(空),但这似乎匹配所有内容。非常感谢任何建议。
#!/usr/bin/expect
set timeout 1200
set user [lindex $argv 0]
set host [lindex $argv 1]
set pass [lindex $argv 2]
set sshkeyfile [open ~/.ssh/id_rsa.pub r]
set sshid [read $sshkeyfile]
close $sshkeyfile
spawn ssh $user@$host "mkdir -m 700 ~/.ssh ; echo \" $sshid\" >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys"
expect {
"continue" { send "Yes\n" ; exp_continue }
"Password" { send "$pass\r"; interact}
"" { send "exit\n" ; exit 0 } # Exit if not asked for "continue/Password"
}
这个怎么样:没有命令的ssh;如果看到密码,则设置一个布尔变量;当您点击 shell 提示符时,如果变量为真,则附加到 authorized_keys
#!/usr/bin/expect
set timeout 1200
lassign $argv user host pass
set sshkeyfile [open ~/.ssh/id_rsa.pub r]
set sshid [read -nonewline $sshkeyfile]
close $sshkeyfile
set sentPassword false
set prompt {$ $} ;# shell prompt ends with "dollar space"
spawn ssh $user@$host
expect {
"continue" {
send "Yes\r"
exp_continue
}
"Password" {
set sentPassword true
send "$pass\r"
exp_continue
}
-re $prompt
}
if {$sentPassword} {
send "mkdir -p -m 700 ~/.ssh ; echo \"$sshid\" >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys\r"
expect -re $prompt
}
send "exit\r"
expect eof
其他变化:
lassign
在一个命令中处理命令行参数read -nonewline
省略 public key 尾随的换行符
mkdir -p
以防止目录已存在时出现错误消息。