С таким расплывчатым вопросом трудно дать больше ответа ...
Вы пробовали Net :: SFTP модуль?
РЕДАКТИРОВАТЬ:
Исходя из правки вопроса - попробуйте использовать Net :: SFTP :: Foreign
use Net::SFTP::Foreign;
use warnings;
use strict;
my $host = "xxx.xxx.xxx.xxx";
my $sftp = Net::SFTP::Foreign->new($host, user => 'user', password => 'pass');
$sftp->error and die "Something bad happened: " . $sftp->error;
$sftp->put("sample.txt", "/home/test/test") or die "put failed: " . $sftp->error;
Вы должны получить более значимое сообщение об ошибке, и вы можете взять его оттуда.