2016-12-05 45 views
1

我有一个python代码,需要在远程主机上获取Unix/Linux(操作系统名称:HP-UX/RedHat的/在SunOS/AIX/Linux的/等)。什么是获得Unix/Linux远程主机上支持的文件/目录信息的最佳方式

程序SSH到远程主机(使用paramiko库)并执行ls -lls -ld取决于它是否是文件或目录。

信息,我需要的是:

  1. 权限(用户/组/其他)
  2. 用户所有者
  3. 集团所有者
  4. 最后修改
  5. 文件名

然而,ls的问题是:

  1. 输出与平台不同,因此需要进行特殊处理,从而使代码冗长使用检查。
  2. 取决于环境变量(对于GNU coreutils,BLOCK_SIZE),文件大小单位可能在输出方面有所不同,或者有些甚至可能不支持这一点。这也需要特定于平台的检查。

我正在寻找一个python库或简单的可移植可执行文件(如果有的话)。

解决方案我认为(但似乎不可行)

  1. 使用正则表达式来检查输出和处理的格式,如果它konwn格式相匹配。但是,由于尝试检查,这似乎很容易出错。
  2. 也尝试检查文件大小的环境变量,并找出输出中的文件大小单位。 (例如,将少量字符回显到文件并检查单元,如果写入4个字符并且大小为1,那么我确信单元大于1个字节,重复步骤)。这似乎也容易出错
  3. 在每台主机上安装跨平台编译器,编译并执行。不能这样做,因为如果主机操作系统重新安装或恢复到没有编译器的位置,则需要重复此安装过程。

有什么建议吗?

回答

3

请问stat有窍门吗?它似乎具有您正在查找的所有功能,并且应该已经安装。

http://ss64.com/bash/stat.html

如果你想在蟒蛇的工作,Python有一个内置的库调用stat它提供了类似的功能:

https://docs.python.org/2/library/stat.html

+0

HP-UX和AIX没有安装'stat'。由于受到限制,我们无法在系统上安装新软件包。 –

+0

你可能想尝试python库。它可能仍然有效,因为它使用stat Linux库调用,而不是可执行文件。查看我编辑的答案 –

+0

'stat' python包是否可以与远程主机一起使用?我认为这只适用于本地文件 –

0

SFTP是内置SSH-标准的文件传输协议2。因此,如果您可以通过SSH连接到远程主机,那么很可能您可以使用SFTP以标准方式列出和统计文件。包括OpenSSH在内的SSH服务器的SFTP为widely supported

paramiko可能是最流行的用于Python的SSH/SFTP包装。下面是一个使用的paramiko做一个SFTP统计一个示例脚本:

import paramiko 

ssh = paramiko.SSHClient() 
ssh.load_system_host_keys() 
ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) # Only warn on no known_hosts 
ssh.connect("localhost", username="sam") 
sftp = ssh.open_sftp() 
try: 
    listing = sftp.listdir_attr(".") 
    print(listing[0:10]) 
    my_stat = sftp.stat(".") 
    print(my_stat) 
    print(my_stat.st_size, my_stat.st_mtime, my_stat.st_atime, my_stat.st_uid, my_stat.st_gid) 
except IOError: 
    pass 
ssh.close() 

当然,这只是一个简单的例子,还有很多可以用的paramiko SFTP API做的 - docs


更新: 相关岗位:SFTP in Python? (platform independent)

0

你可能不会对所有的机器上安装任何蟒蛇,但我敢打赌,你有Perl的一些古老的硬皮版上连HPUX箱。

~/tmp/t3 $perl -e 'print (join (",", (stat("t.awk"))), "\n");' 
655368,160089,33204,1,16257,200,0,178,1480727842,1480710575,1480710575,4096,8 

~/tmp/t3 $stat t.awk 
    File: `t.awk' 
    Size: 178    Blocks: 8   IO Block: 4096 regular file 
Device: a0008h/655368d Inode: 160089  Links: 1 
Access: (0664/-rw-rw-r--) Uid: (16257/mcgowan) Gid: ( 200/ users) 
Access: 2016-12-02 17:17:22.000000000 -0800 
Modify: 2016-12-02 12:29:35.000000000 -0800 
Change: 2016-12-02 12:29:35.000000000 -0800 

下面是perl的统计领域的交叉引用:

0 dev  device number of filesystem 
    1 ino  inode number 
    2 mode  file mode (type and permissions) 
    3 nlink number of (hard) links to the file 
    4 uid  numeric user ID of file's owner 
    5 gid  numeric group ID of file's owner 
    6 rdev  the device identifier (special files only) 
    7 size  total size of file, in bytes 
    8 atime last access time in seconds since the epoch 
    9 mtime last modify time in seconds since the epoch 
10 ctime inode change time in seconds since the epoch (*) 
11 blksize preferred I/O size in bytes for interacting with the 
      file (may vary from file to file) 
12 blocks actual number of system-specific blocks allocated 
      on disk (often, but not always, 512 bytes each) 
+0

当然,您还需要做一些额外的工作如果需要目录中的所有条目,则将uid/gid放入名称中,然后遍历目录树。应该尽可能以perl安装最少的方式进行操作,不需要CPAN模块... –

相关问题