Đây là biến thể công phu của tôi về câu trả lời của @ ArekBurdach. Nó cung cấp các phần mở rộng sau:
- các máy chủ có thể ở bất cứ đâu trong
ssh
dòng lệnh; tức là nó cũng hỗ trợ ssh <args> <host> <commands>
cú pháp
- không khó mã hóa đường dẫn đến
ssh
- phân tích cú pháp mạnh mẽ hơn
ssh_config
- Phần thưởng: bao bọc cho
scp
quá
ssh-wrapper
#!/bin/bash
password=$(awk '
BEGIN {
# Collect the SSH arguments as keys of a dictionary, so that we can easily
# check for inclusion.
for (i = 2; i < ARGC; i++) {
sshArgs[ARGV[i]] = 1
}
# Only process the first argument; all others are the command-line arguments
# given to ssh.
ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
if ($2 in sshArgs)
inhost=1
else
inhost=0
}
' ~/.ssh/config "$@")
if [ "$password" ]; then
sshpass -p "$password" "$(which ssh)" "$@"
else
"$(which ssh)" "$@"
fi
scp-wrapper
#!/bin/bash
password=$(awk '
BEGIN {
# Collect the SCP arguments as keys of a dictionary, so that we can easily
# check for inclusion.
for (i = 2; i < ARGC; i++) {
colonIdx = index(ARGV[i], ":")
if (colonIdx > 0) {
scpArgs[substr(ARGV[i], 1, colonIdx - 1)] = 1
}
}
# Only process the first argument; all others are the command-line arguments
# given to scp.
ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
if ($2 in scpArgs)
inhost=1
else
inhost=0
}
' ~/.ssh/config "$@")
if [ "$password" ]; then
sshpass -p "$password" "$(which scp)" "$@"
else
"$(which scp)" "$@"
fi
Cài đặt
Xác định bí danh trong ~/.bashrc
:
alias ssh=ssh-wrapper
alias scp=scp-wrapper
Cấu hình
Với IgnoreUnknown
chỉ thị, ssh
không phàn nàn về một lệnh mới được giới thiệu Password
, vì vậy (ngược lại với câu trả lời của @ ArekBurdach), chúng ta có thể làm cho nó xuất hiện dưới dạng cấu hình "thực". Nếu bạn không thích điều này, việc thay đổi kịch bản trở lại thành bình luận là chuyện nhỏ.
# Allow specifying passwords for Host entries, to be parsed by ssh-wrapper.
IgnoreUnknown Password
Host foohost
User baruser
Password foobarpassword