尝试在 SFTP 中实现双重身份验证
Trying to implement Dual Authentication in SFTP
根据我客户的要求,我正在尝试在 SFTP 文件传输中实现双重身份验证(密码、密钥),首选身份验证必须按密码、public 密钥、键盘交互的顺序进行。
我尝试通过两种方式实现这一目标:
1) 使用 NET::SFTP::Foreign
但是这个模块默认首选身份验证为 public 密钥,密码,并且不允许我用密码覆盖相同的内容,public 密钥,即使我在命令中明确提及也是如此。
$sftp=Net::SFTP::Foreign->new("xyz.com",
user=> pqr,
password=>1234,
port=>2222,
key_path=>/home/ddd/.ssh/id_rsa,
more=>[-vo=>'StrictHostKeyChecking=no',
-o=>"ProxyCommand=/usr/bin/ssh " .
"-o UserKnownHostsFile=/dev/null ".
"-o StrictHostKeyChecking=no ".
"-oPreferredAuthentications=password,publickey,keyboard-interactive " .
"-oNumberOfPasswordPrompts=1 " .
"-i /home/nnn/.ssh/flsftp " .
"-l flsftp proxyserver.com " .
"nc xyz.com 2222"]);
2) 使用SFTP命令
我可以使用 SFTP 命令手动建立连接,并在提示时输入密码,但要通过 Perl 自动连接,我无法找到在命令行中传递密码的方法。我开始知道一些方法,比如 sshpass 或 expect 但由于安全原因,我不能使用任何一个。
sftp -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no \
-i /home/ddd/.ssh/id_rsa \
-o PreferredAuthentications=password,publickey,keyboard-interactive \
-o NumberOfPasswordPrompts=1 \
-o 'ProxyCommand=/usr/bin/ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /home/nnn/.ssh/flsftp -l flsftp proxyserver.com nc xyz.com 2222' \
pqr@xyz.com
Net::SFTP::Foreign 会尝试检测您自己设置 PreferredAuthentications
的情况,以便让它保持不变。只是检测代码不是很复杂,有时会失败。尝试如下操作:
$sftp=Net::SFTP::Foreign->new("xyz.com",
user => "pqr",
password => "1234",
port => 2222,
key_path => "/home/ddd/.ssh/id_rsa",
more => ['-v',
-o => 'StrictHostKeyChecking=no',
-o => 'UserKnownHostsFile=/dev/null',
-o => 'PreferredAuthentications=password,publickey,keyboard-interactive']);
根据我客户的要求,我正在尝试在 SFTP 文件传输中实现双重身份验证(密码、密钥),首选身份验证必须按密码、public 密钥、键盘交互的顺序进行。
我尝试通过两种方式实现这一目标:
1) 使用 NET::SFTP::Foreign 但是这个模块默认首选身份验证为 public 密钥,密码,并且不允许我用密码覆盖相同的内容,public 密钥,即使我在命令中明确提及也是如此。
$sftp=Net::SFTP::Foreign->new("xyz.com",
user=> pqr,
password=>1234,
port=>2222,
key_path=>/home/ddd/.ssh/id_rsa,
more=>[-vo=>'StrictHostKeyChecking=no',
-o=>"ProxyCommand=/usr/bin/ssh " .
"-o UserKnownHostsFile=/dev/null ".
"-o StrictHostKeyChecking=no ".
"-oPreferredAuthentications=password,publickey,keyboard-interactive " .
"-oNumberOfPasswordPrompts=1 " .
"-i /home/nnn/.ssh/flsftp " .
"-l flsftp proxyserver.com " .
"nc xyz.com 2222"]);
2) 使用SFTP命令 我可以使用 SFTP 命令手动建立连接,并在提示时输入密码,但要通过 Perl 自动连接,我无法找到在命令行中传递密码的方法。我开始知道一些方法,比如 sshpass 或 expect 但由于安全原因,我不能使用任何一个。
sftp -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no \
-i /home/ddd/.ssh/id_rsa \
-o PreferredAuthentications=password,publickey,keyboard-interactive \
-o NumberOfPasswordPrompts=1 \
-o 'ProxyCommand=/usr/bin/ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /home/nnn/.ssh/flsftp -l flsftp proxyserver.com nc xyz.com 2222' \
pqr@xyz.com
Net::SFTP::Foreign 会尝试检测您自己设置 PreferredAuthentications
的情况,以便让它保持不变。只是检测代码不是很复杂,有时会失败。尝试如下操作:
$sftp=Net::SFTP::Foreign->new("xyz.com",
user => "pqr",
password => "1234",
port => 2222,
key_path => "/home/ddd/.ssh/id_rsa",
more => ['-v',
-o => 'StrictHostKeyChecking=no',
-o => 'UserKnownHostsFile=/dev/null',
-o => 'PreferredAuthentications=password,publickey,keyboard-interactive']);