📄 smbctool.c
字号:
/* ToDo : Print out the ACL values. */ if (SVAL(retbuf,0) != SMB_POSIX_ACL_VERSION || rb_size < 6) { d_printf("getfacl file %s, unknown POSIX acl version %u.\n", src, (unsigned int)CVAL(retbuf,0) ); SAFE_FREE(retbuf); return 1; } num_file_acls = SVAL(retbuf,2); num_dir_acls = SVAL(retbuf,4); if (rb_size != SMB_POSIX_ACL_HEADER_SIZE + SMB_POSIX_ACL_ENTRY_SIZE*(num_file_acls+num_dir_acls)) { d_printf("getfacl file %s, incorrect POSIX acl buffer size (should be %u, was %u).\n", src, (unsigned int)(SMB_POSIX_ACL_HEADER_SIZE + SMB_POSIX_ACL_ENTRY_SIZE*(num_file_acls+num_dir_acls)), (unsigned int)rb_size); SAFE_FREE(retbuf); return 1; } d_printf("# file: %s\n", src); d_printf("# owner: %u\n# group: %u\n", (unsigned int)sbuf.st_uid, (unsigned int)sbuf.st_gid); if (num_file_acls == 0 && num_dir_acls == 0) { d_printf("No acls found.\n"); } for (i = 0; i < num_file_acls; i++) { uint32 uorg; fstring permstring; unsigned char tagtype = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE)); unsigned char perms = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE)+1); switch(tagtype) { case SMB_POSIX_ACL_USER_OBJ: d_printf("user::"); break; case SMB_POSIX_ACL_USER: uorg = IVAL(retbuf,SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE)+2); d_printf("user:%u:", uorg); break; case SMB_POSIX_ACL_GROUP_OBJ: d_printf("group::"); break; case SMB_POSIX_ACL_GROUP: uorg = IVAL(retbuf,SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE)+2); d_printf("group:%u", uorg); break; case SMB_POSIX_ACL_MASK: d_printf("mask::"); break; case SMB_POSIX_ACL_OTHER: d_printf("other::"); break; default: d_printf("getfacl file %s, incorrect POSIX acl tagtype (%u).\n", src, (unsigned int)tagtype ); SAFE_FREE(retbuf); return 1; } d_printf("%s\n", perms_to_string(permstring, perms)); } for (i = 0; i < num_dir_acls; i++) { uint32 uorg; fstring permstring; unsigned char tagtype = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE)); unsigned char perms = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE)+1); switch(tagtype) { case SMB_POSIX_ACL_USER_OBJ: d_printf("default:user::"); break; case SMB_POSIX_ACL_USER: uorg = IVAL(retbuf,SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE)+2); d_printf("default:user:%u:", uorg); break; case SMB_POSIX_ACL_GROUP_OBJ: d_printf("default:group::"); break; case SMB_POSIX_ACL_GROUP: uorg = IVAL(retbuf,SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE)+2); d_printf("default:group:%u", uorg); break; case SMB_POSIX_ACL_MASK: d_printf("default:mask::"); break; case SMB_POSIX_ACL_OTHER: d_printf("default:other::"); break; default: d_printf("getfacl file %s, incorrect POSIX acl tagtype (%u).\n", src, (unsigned int)tagtype ); SAFE_FREE(retbuf); return 1; } d_printf("%s\n", perms_to_string(permstring, perms)); } SAFE_FREE(retbuf); return 0;}/**************************************************************************** UNIX stat.****************************************************************************/static int cmd_stat(void){ pstring src, name; fstring mode_str; SMB_STRUCT_STAT sbuf; struct cli_state *targetcli; pstring targetname; if (!SERVER_HAS_UNIX_CIFS(cli)) { d_printf("Server doesn't support UNIX CIFS calls.\n"); return 1; } pstrcpy(src,cur_dir); if (!next_token_nr(NULL,name,NULL,sizeof(name))) { d_printf("stat file\n"); return 1; } pstrcat(src,name); if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) { d_printf("stat %s: %s\n", src, cli_errstr(cli)); return 1; } if (!cli_unix_stat(targetcli, targetname, &sbuf)) { d_printf("%s stat file %s\n", cli_errstr(targetcli), src); return 1; } /* Print out the stat values. */ d_printf("File: %s\n", src); d_printf("Size: %-12.0f\tBlocks: %u\t%s\n", (double)sbuf.st_size, (unsigned int)sbuf.st_blocks, filetype_to_str(sbuf.st_mode));#if defined(S_ISCHR) && defined(S_ISBLK) if (S_ISCHR(sbuf.st_mode) || S_ISBLK(sbuf.st_mode)) { d_printf("Inode: %.0f\tLinks: %u\tDevice type: %u,%u\n", (double)sbuf.st_ino, (unsigned int)sbuf.st_nlink, unix_dev_major(sbuf.st_rdev), unix_dev_minor(sbuf.st_rdev)); } else #endif d_printf("Inode: %.0f\tLinks: %u\n", (double)sbuf.st_ino, (unsigned int)sbuf.st_nlink); d_printf("Access: (0%03o/%s)\tUid: %u\tGid: %u\n", ((int)sbuf.st_mode & 0777), unix_mode_to_str(mode_str, sbuf.st_mode), (unsigned int)sbuf.st_uid, (unsigned int)sbuf.st_gid); strftime(mode_str, sizeof(mode_str), "%F %T %z", localtime(&sbuf.st_atime)); d_printf("Access: %s\n", mode_str); strftime(mode_str, sizeof(mode_str), "%F %T %z", localtime(&sbuf.st_mtime)); d_printf("Modify: %s\n", mode_str); strftime(mode_str, sizeof(mode_str), "%F %T %z", localtime(&sbuf.st_ctime)); d_printf("Change: %s\n", mode_str); return 0;}/**************************************************************************** UNIX chown.****************************************************************************/static int cmd_chown(void){ pstring src; uid_t uid; gid_t gid; pstring buf, buf2, buf3; struct cli_state *targetcli; pstring targetname; pstrcpy(src,cur_dir); if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) || !next_token_nr(NULL,buf2,NULL, sizeof(buf2)) || !next_token_nr(NULL,buf3,NULL, sizeof(buf3))) { d_printf("chown uid gid file\n"); return 1; } uid = (uid_t)atoi(buf); gid = (gid_t)atoi(buf2); pstrcat(src,buf3); if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) { d_printf("chown %s: %s\n", src, cli_errstr(cli)); return 1; } if (!SERVER_HAS_UNIX_CIFS(targetcli)) { d_printf("Server doesn't support UNIX CIFS calls.\n"); return 1; } if (!cli_unix_chown(targetcli, targetname, uid, gid)) { d_printf("%s chown file %s uid=%d, gid=%d\n", cli_errstr(targetcli), src, (int)uid, (int)gid); return 1; } return 0;}/**************************************************************************** Rename some file.****************************************************************************/static int cmd_rename(void){ int err; pstring src, dest; pstring oname, nname; pstrcpy(src, "smb:"); pstrcat(src, service); pstrcat(src, cur_dir); pstrcpy(dest, src); if (!next_token_nr(NULL,oname,NULL,sizeof(oname)) || !next_token_nr(NULL,nname,NULL, sizeof(nname))) { d_printf("rename <src> <dest>\n"); return 1; } pstrcat(src, oname); pstrcat(dest, nname); DEBUG(4, ("O: %s\nN: %s\n", src, dest)); err = smbc_rename(src, dest); if (err < 0) { d_printf("%s renaming files\n", strerror(errno)); return 1; } return 0;}/**************************************************************************** Print the volume name.****************************************************************************/static int cmd_volume(void){ fstring volname; uint32 serial_num; time_t create_date; if (!cli_get_fs_volume_info(cli, volname, &serial_num, &create_date)) { d_printf("Errr %s getting volume info\n",cli_errstr(cli)); return 1; } d_printf("Volume: |%s| serial number 0x%x\n", volname, (unsigned int)serial_num); return 0;}/**************************************************************************** Hard link files using the NT call.****************************************************************************/static int cmd_hardlink(void){ pstring src,dest; pstring buf,buf2; struct cli_state *targetcli; pstring targetname; pstrcpy(src,cur_dir); pstrcpy(dest,cur_dir); if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) || !next_token_nr(NULL,buf2,NULL, sizeof(buf2))) { d_printf("hardlink <src> <dest>\n"); return 1; } pstrcat(src,buf); pstrcat(dest,buf2); if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) { d_printf("hardlink %s: %s\n", src, cli_errstr(cli)); return 1; } if (!SERVER_HAS_UNIX_CIFS(targetcli)) { d_printf("Server doesn't support UNIX CIFS calls.\n"); return 1; } if (!cli_nt_hardlink(targetcli, targetname, dest)) { d_printf("%s doing an NT hard link of files\n",cli_errstr(targetcli)); return 1; } return 0;}/**************************************************************************** Toggle the prompt flag.****************************************************************************/static int cmd_prompt(void){ prompt = !prompt; DEBUG(2,("prompting is now %s\n",prompt?"on":"off")); return 1;}/**************************************************************************** Set the newer than time.****************************************************************************/static int cmd_newer(void){ pstring buf; BOOL ok; SMB_STRUCT_STAT sbuf; ok = next_token_nr(NULL,buf,NULL,sizeof(buf)); if (ok && (sys_stat(buf,&sbuf) == 0)) { newer_than = sbuf.st_mtime; DEBUG(1,("Getting files newer than %s", asctime(localtime(&newer_than)))); } else { newer_than = 0; } if (ok && newer_than == 0) { d_printf("Error setting newer-than time\n"); return 1; } return 0;}/**************************************************************************** Set the archive level.****************************************************************************/static int cmd_archive(void){ pstring buf; if (next_token_nr(NULL,buf,NULL,sizeof(buf))) { archive_level = atoi(buf); } else d_printf("Archive level is %d\n",archive_level); return 0;}/**************************************************************************** Toggle the lowercaseflag.****************************************************************************/static int cmd_lowercase(void){ lowercase = !lowercase; DEBUG(2,("filename lowercasing is now %s\n",lowercase?"on":"off")); return 0;}/**************************************************************************** Toggle the case sensitive flag.****************************************************************************/static int cmd_setcase(void){ BOOL orig_case_sensitive = cli_set_case_sensitive(cli, False); cli_set_case_sensitive(cli, !orig_case_sensitive); DEBUG(2,("filename case sensitivity is now %s\n",!orig_case_sensitive ? "on":"off")); return 0;}/**************************************************************************** Toggle the recurse flag.****************************************************************************/static int cmd_recurse(void){ recurse = !recurse; DEBUG(2,("directory recursion is now %s\n",recurse?"on":"off")); return 0;}/**************************************************************************** Toggle the translate flag.****************************************************************************/static int cmd_translate(void){ translation = !translation; DEBUG(2,("CR/LF<->LF and print text translation now %s\n", translation?"on":"off")); return 0;}/**************************************************************************** Do the lcd command. ****************************************************************************/static int cmd_lcd(void){ pstring buf; pstring d; if (next_token_nr(NULL,buf,NULL,sizeof(buf))) chdir(buf); DEBUG(2,("the local directory is now %s\n",sys_getwd(d))); return 0;}/**************************************************************************** Get a file restarting at end of local file. ****************************************************************************/static int cmd_reget(void){ pstring local_name; pstring remote_name; char *p; pstrcpy(remote_name, cur_dir); pstrcat(remote_name, "/"); p = remote_name + strlen(remote_name); if (!next_token_nr(NULL, p, NULL, sizeof(remote_name) - strlen(remote_name))) { d_printf("reget <filename>\n"); return 1; } pstrcpy(local_name, p); dos_clean_name(remote_name); next_token_nr(NULL, local_name, NULL, sizeof(local_name)); return do_get(remote_name, local_name, True);}/**************************************************************************** Put a file restarting at end of local file. ****************************************************************************/static int cmd_reput(void){ pstring local_name; pstring remote_name; pstring buf; char *p = buf; SMB_STRUCT_STAT st; pstrcpy(remote_name, cur_dir); pstrcat(remote_name, "/"); if (!next_token_nr(NULL, p, NULL, sizeof(buf))) { d_printf("reput <filename>\n"); return 1; } pstrcpy(local_name, p); if (!file_exist(local_name, &st)) { d_printf("%s does not exist\n", local_name); return 1; } if (next_token_nr(NULL, p, NULL, sizeof(buf))) pstrcat(remote_name, p); else pstrcat(remote_name, local_name); dos_clean_name(remote_name); return do_put(remote_name, local_name, True);}/**************************************************************************** List a share name. ****************************************************************************/static void browse_fn(const char *name, uint32 m, const char *comment, void *state){ fstring typestr; *typestr=0; switch (m) { case STYPE_DISKTREE: fstrcpy(typestr,"Disk"); break; case STYPE_PRINTQ: fstrcpy(typestr,"Printer"); break; case STYPE_DEVICE: fstrcpy(typestr,"Device"); break; case STYPE_IPC: fstrcpy(typestr,"IPC"); break; } /* FIXME: If the remote machine returns non-ascii characters in any of these fields, they can corrupt the output. We should remove them. */ if (!grepable) { d_printf("\t%-15s %-10.10s%s\n", name,typestr,comment); } else { d_printf ("%s|%s|%s\n",typestr,name,comment); }}/**************************************************************************** Try and browse available connections on a host.************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -