perl脚本中的ssh
我是perl新手。我有一个带有管道分隔线的输入文件,其中包含服务器名称,文件名作为字段。文件名在输入提要文件中具有通配符(*)。 实际文件名将以时间戳作为后缀perl脚本中的ssh,perl,file,ssh,return,Perl,File,Ssh,Return,我是perl新手。我有一个带有管道分隔线的输入文件,其中包含服务器名称,文件名作为字段。文件名在输入提要文件中具有通配符(*)。 实际文件名将以时间戳作为后缀 Ex: Actual files in remote servers server_1/abc_20110801.txt server_1/abc_20110802.txt server_1/abc_20110803.txt server_2/xyz_20110801.dat server_2/xyz_20110802.dat Ex
Ex: Actual files in remote servers
server_1/abc_20110801.txt
server_1/abc_20110802.txt
server_1/abc_20110803.txt
server_2/xyz_20110801.dat
server_2/xyz_20110802.dat
Ex: Input feed file
server_1|abc_*.txt
server_2|xyz_*.dat
我正在尝试通过ssh连接到远程服务器,读取文件并捕获“最新”文件的时间戳(在本例中为server_1/abc_20110803.txt和server_2/xyz_20110802.dat)。
所有远程服务器的ssh密钥都已经设置好,因此我们不需要传递用户id和密码
如果文件存在于同一服务器中,我可以使用以下方法执行此操作:
my @list_files = map { chomp; $_ } (`ls -t $wild_f_nme`);
my $f_nme=$list_files[0];
my ($accesstime, $modtime, $createtime, $fsize) = (stat($f_nme))[8,9,10,7];
如何检查远程服务器中文件的时间戳。我需要为每个服务器启动ssh连接
仅供参考-我无法安装任何模块(如Net::OpenSSH)。
我们可以用类似的方法来实现这一点吗
my @list_files = map { chomp; $_ } (`qx/ssh $serv_nme ls -t $d_loc/$wild_f_nme`);
您可以通过以下方法使文件名更加平滑: 您可以使用正则表达式提取日期中的数字,例如
my ($date) = $files[0] =~ /(\d{8})/;
我将使用日期模块来查找最近的日期。比如 看看
GRID::Machine
。它允许您在远程机器上执行perl代码并返回perl数据结构
类似的方法应该可以工作(未经测试):
谢谢你的回复。但我的主要挑战是通过ssh连接到远程服务器并捕获文件修改时间戳。你问我怎么能检查时间戳,我很困惑。如果不能使用模块,那么在perl中使用ssh将很困难。假设您的系统上有ssh,您可以执行ssh命令来执行一些perl代码。看见
my ($date) = $files[0] =~ /(\d{8})/;
use GRID::Machine;
my $machine = GRID::Machine->new(host => $host);
my $r = $machine->sub(
get_files=> q{
my $pattern = shift;
my @files = glob($pattern);
# now stat each file name
my %stats;
for my $path (@files) {
$stats{$path} = [ stat($path) ]
}
return \%stats;
};
);
die $r->errmsg unless $r->ok;
$r = $machine->get_file_info($pattern);
my $stats = $r->Result;
# $stats is an array of hashes indexed by file name.
# $stats->{$path}->[7] is the file length of $path on the remote machine