📄 client.c
字号:
lname[strlen(lname)-1] = '/'; if (!seek_list(temp_list, lname)) break; } else { /* Yes */ SAFE_FREE(rname); if(asprintf(&rname, "%s%s", ctx->remote_cur_dir, lname) < 0) break; dos_format(rname); if (NT_STATUS_IS_ERR(smbcli_chkpath(ctx->cli->tree, rname)) && NT_STATUS_IS_ERR(do_mkdir(ctx, rname))) { DEBUG (0, ("Unable to make dir, skipping...")); /* Skip the directory */ lname[strlen(lname)-1] = '/'; if (!seek_list(temp_list, lname)) break; } } continue; } else { SAFE_FREE(quest); if (asprintf(&quest,"Put file %s? ", lname) < 0) break; if (ctx->prompt && !yesno(quest)) /* No */ continue; /* Yes */ SAFE_FREE(rname); if (asprintf(&rname, "%s%s", ctx->remote_cur_dir, lname) < 0) break; } dos_format(rname); do_put(ctx, rname, lname, false); } free_file_list(file_list); SAFE_FREE(quest); SAFE_FREE(lname); SAFE_FREE(rname); } return 0;}/**************************************************************************** print a file ****************************************************************************/static int cmd_print(struct smbclient_context *ctx, const char **args){ char *lname, *rname; char *p; if (!args[1]) { d_printf("print <filename>\n"); return 1; } lname = talloc_strdup(ctx, args[1]); rname = talloc_strdup(ctx, lname); p = strrchr_m(rname,'/'); if (p) { slprintf(rname, sizeof(rname)-1, "%s-%d", p+1, (int)getpid()); } if (strequal(lname,"-")) { slprintf(rname, sizeof(rname)-1, "stdin-%d", (int)getpid()); } return do_put(ctx, rname, lname, false);}static int cmd_rewrite(struct smbclient_context *ctx, const char **args){ d_printf("REWRITE: command not implemented (FIXME!)\n"); return 0;}/****************************************************************************delete some files****************************************************************************/static int cmd_del(struct smbclient_context *ctx, const char **args){ char *mask; uint16_t attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN; if (ctx->recurse) attribute |= FILE_ATTRIBUTE_DIRECTORY; if (!args[1]) { d_printf("del <filename>\n"); return 1; } mask = talloc_asprintf(ctx,"%s%s", ctx->remote_cur_dir, args[1]); if (NT_STATUS_IS_ERR(smbcli_unlink(ctx->cli->tree, mask))) { d_printf("%s deleting remote file %s\n",smbcli_errstr(ctx->cli->tree),mask); } return 0;}/****************************************************************************delete a whole directory tree****************************************************************************/static int cmd_deltree(struct smbclient_context *ctx, const char **args){ char *dname; int ret; if (!args[1]) { d_printf("deltree <dirname>\n"); return 1; } dname = talloc_asprintf(ctx, "%s%s", ctx->remote_cur_dir, args[1]); ret = smbcli_deltree(ctx->cli->tree, dname); if (ret == -1) { printf("Failed to delete tree %s - %s\n", dname, smbcli_errstr(ctx->cli->tree)); return -1; } printf("Deleted %d files in %s\n", ret, dname); return 0;}typedef struct { const char *level_name; enum smb_fsinfo_level level;} fsinfo_level_t;fsinfo_level_t fsinfo_levels[] = { {"dskattr", RAW_QFS_DSKATTR}, {"allocation", RAW_QFS_ALLOCATION}, {"volume", RAW_QFS_VOLUME}, {"volumeinfo", RAW_QFS_VOLUME_INFO}, {"sizeinfo", RAW_QFS_SIZE_INFO}, {"deviceinfo", RAW_QFS_DEVICE_INFO}, {"attributeinfo", RAW_QFS_ATTRIBUTE_INFO}, {"unixinfo", RAW_QFS_UNIX_INFO}, {"volume-information", RAW_QFS_VOLUME_INFORMATION}, {"size-information", RAW_QFS_SIZE_INFORMATION}, {"device-information", RAW_QFS_DEVICE_INFORMATION}, {"attribute-information", RAW_QFS_ATTRIBUTE_INFORMATION}, {"quota-information", RAW_QFS_QUOTA_INFORMATION}, {"fullsize-information", RAW_QFS_FULL_SIZE_INFORMATION}, {"objectid", RAW_QFS_OBJECTID_INFORMATION}, {NULL, RAW_QFS_GENERIC}};static int cmd_fsinfo(struct smbclient_context *ctx, const char **args){ union smb_fsinfo fsinfo; NTSTATUS status; fsinfo_level_t *fsinfo_level; if (!args[1]) { d_printf("fsinfo <level>, where level is one of following:\n"); fsinfo_level = fsinfo_levels; while(fsinfo_level->level_name) { d_printf("%s\n", fsinfo_level->level_name); fsinfo_level++; } return 1; } fsinfo_level = fsinfo_levels; while(fsinfo_level->level_name && !strequal(args[1],fsinfo_level->level_name)) { fsinfo_level++; } if (!fsinfo_level->level_name) { d_printf("wrong level name!\n"); return 1; } fsinfo.generic.level = fsinfo_level->level; status = smb_raw_fsinfo(ctx->cli->tree, ctx, &fsinfo); if (!NT_STATUS_IS_OK(status)) { d_printf("fsinfo-level-%s - %s\n", fsinfo_level->level_name, nt_errstr(status)); return 1; } d_printf("fsinfo-level-%s:\n", fsinfo_level->level_name); switch(fsinfo.generic.level) { case RAW_QFS_DSKATTR: d_printf("\tunits_total: %hu\n", (unsigned short) fsinfo.dskattr.out.units_total); d_printf("\tblocks_per_unit: %hu\n", (unsigned short) fsinfo.dskattr.out.blocks_per_unit); d_printf("\tblocks_size: %hu\n", (unsigned short) fsinfo.dskattr.out.block_size); d_printf("\tunits_free: %hu\n", (unsigned short) fsinfo.dskattr.out.units_free); break; case RAW_QFS_ALLOCATION: d_printf("\tfs_id: %lu\n", (unsigned long) fsinfo.allocation.out.fs_id); d_printf("\tsectors_per_unit: %lu\n", (unsigned long) fsinfo.allocation.out.sectors_per_unit); d_printf("\ttotal_alloc_units: %lu\n", (unsigned long) fsinfo.allocation.out.total_alloc_units); d_printf("\tavail_alloc_units: %lu\n", (unsigned long) fsinfo.allocation.out.avail_alloc_units); d_printf("\tbytes_per_sector: %hu\n", (unsigned short) fsinfo.allocation.out.bytes_per_sector); break; case RAW_QFS_VOLUME: d_printf("\tserial_number: %lu\n", (unsigned long) fsinfo.volume.out.serial_number); d_printf("\tvolume_name: %s\n", fsinfo.volume.out.volume_name.s); break; case RAW_QFS_VOLUME_INFO: case RAW_QFS_VOLUME_INFORMATION: d_printf("\tcreate_time: %s\n", nt_time_string(ctx,fsinfo.volume_info.out.create_time)); d_printf("\tserial_number: %lu\n", (unsigned long) fsinfo.volume_info.out.serial_number); d_printf("\tvolume_name: %s\n", fsinfo.volume_info.out.volume_name.s); break; case RAW_QFS_SIZE_INFO: case RAW_QFS_SIZE_INFORMATION: d_printf("\ttotal_alloc_units: %llu\n", (unsigned long long) fsinfo.size_info.out.total_alloc_units); d_printf("\tavail_alloc_units: %llu\n", (unsigned long long) fsinfo.size_info.out.avail_alloc_units); d_printf("\tsectors_per_unit: %lu\n", (unsigned long) fsinfo.size_info.out.sectors_per_unit); d_printf("\tbytes_per_sector: %lu\n", (unsigned long) fsinfo.size_info.out.bytes_per_sector); break; case RAW_QFS_DEVICE_INFO: case RAW_QFS_DEVICE_INFORMATION: d_printf("\tdevice_type: %lu\n", (unsigned long) fsinfo.device_info.out.device_type); d_printf("\tcharacteristics: 0x%lx\n", (unsigned long) fsinfo.device_info.out.characteristics); break; case RAW_QFS_ATTRIBUTE_INFORMATION: case RAW_QFS_ATTRIBUTE_INFO: d_printf("\tfs_attr: 0x%lx\n", (unsigned long) fsinfo.attribute_info.out.fs_attr); d_printf("\tmax_file_component_length: %lu\n", (unsigned long) fsinfo.attribute_info.out.max_file_component_length); d_printf("\tfs_type: %s\n", fsinfo.attribute_info.out.fs_type.s); break; case RAW_QFS_UNIX_INFO: d_printf("\tmajor_version: %hu\n", (unsigned short) fsinfo.unix_info.out.major_version); d_printf("\tminor_version: %hu\n", (unsigned short) fsinfo.unix_info.out.minor_version); d_printf("\tcapability: 0x%llx\n", (unsigned long long) fsinfo.unix_info.out.capability); break; case RAW_QFS_QUOTA_INFORMATION: d_printf("\tunknown[3]: [%llu,%llu,%llu]\n", (unsigned long long) fsinfo.quota_information.out.unknown[0], (unsigned long long) fsinfo.quota_information.out.unknown[1], (unsigned long long) fsinfo.quota_information.out.unknown[2]); d_printf("\tquota_soft: %llu\n", (unsigned long long) fsinfo.quota_information.out.quota_soft); d_printf("\tquota_hard: %llu\n", (unsigned long long) fsinfo.quota_information.out.quota_hard); d_printf("\tquota_flags: 0x%llx\n", (unsigned long long) fsinfo.quota_information.out.quota_flags); break; case RAW_QFS_FULL_SIZE_INFORMATION: d_printf("\ttotal_alloc_units: %llu\n", (unsigned long long) fsinfo.full_size_information.out.total_alloc_units); d_printf("\tcall_avail_alloc_units: %llu\n", (unsigned long long) fsinfo.full_size_information.out.call_avail_alloc_units); d_printf("\tactual_avail_alloc_units: %llu\n", (unsigned long long) fsinfo.full_size_information.out.actual_avail_alloc_units); d_printf("\tsectors_per_unit: %lu\n", (unsigned long) fsinfo.full_size_information.out.sectors_per_unit); d_printf("\tbytes_per_sector: %lu\n", (unsigned long) fsinfo.full_size_information.out.bytes_per_sector); break; case RAW_QFS_OBJECTID_INFORMATION: d_printf("\tGUID: %s\n", GUID_string(ctx,&fsinfo.objectid_information.out.guid)); d_printf("\tunknown[6]: [%llu,%llu,%llu,%llu,%llu,%llu]\n", (unsigned long long) fsinfo.objectid_information.out.unknown[0], (unsigned long long) fsinfo.objectid_information.out.unknown[1], (unsigned long long) fsinfo.objectid_information.out.unknown[2], (unsigned long long) fsinfo.objectid_information.out.unknown[3], (unsigned long long) fsinfo.objectid_information.out.unknown[4], (unsigned long long) fsinfo.objectid_information.out.unknown[5] ); break; case RAW_QFS_GENERIC: d_printf("\twrong level returned\n"); break; } return 0;}/****************************************************************************show as much information as possible about a file****************************************************************************/static int cmd_allinfo(struct smbclient_context *ctx, const char **args){ char *fname; union smb_fileinfo finfo; NTSTATUS status; int fnum; if (!args[1]) { d_printf("allinfo <filename>\n"); return 1; } fname = talloc_asprintf(ctx, "%s%s", ctx->remote_cur_dir, args[1]); /* first a ALL_INFO QPATHINFO */ finfo.generic.level = RAW_FILEINFO_ALL_INFO; finfo.generic.in.file.path = fname; status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo); if (!NT_STATUS_IS_OK(status)) { d_printf("%s - %s\n", fname, nt_errstr(status)); return 1; } d_printf("\tcreate_time: %s\n", nt_time_string(ctx, finfo.all_info.out.create_time)); d_printf("\taccess_time: %s\n", nt_time_string(ctx, finfo.all_info.out.access_time)); d_printf("\twrite_time: %s\n", nt_time_string(ctx, finfo.all_info.out.write_time)); d_printf("\tchange_time: %s\n", nt_time_string(ctx, finfo.all_info.out.change_time)); d_printf("\tattrib: 0x%x\n", finfo.all_info.out.attrib); d_printf("\talloc_size: %lu\n", (unsigned long)finfo.all_info.out.alloc_size); d_printf("\tsize: %lu\n", (unsigned long)finfo.all_info.out.size); d_printf("\tnlink: %u\n", finfo.all_info.out.nlink); d_printf("\tdelete_pending: %u\n", finfo.all_info.out.delete_pending); d_printf("\tdirectory: %u\n", finfo.all_info.out.directory); d_printf("\tea_size: %u\n", finfo.all_info.out.ea_size); d_printf("\tfname: '%s'\n", finfo.all_info.out.fname.s); /* 8.3 name if any */ finfo.generic.level = RAW_FILEINFO_ALT_NAME_INFO; status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo); if (NT_STATUS_IS_OK(status)) { d_printf("\talt_name: %s\n", finfo.alt_name_info.out.fname.s); } /* file_id if available */ finfo.generic.level = RAW_FILEINFO_INTERNAL_INFORMATION; status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo); if (NT_STATUS_IS_OK(status)) { d_printf("\tfile_id %.0f\n", (double)finfo.internal_information.out.file_id); } /* the EAs, if any */ finfo.generic.level = RAW_FILEINFO_ALL_EAS; status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo); if (NT_STATUS_IS_OK(status)) { int i; for (i=0;i<finfo.all_eas.out.num_eas;i++) { d_printf("\tEA[%d] flags=%d len=%d '%s'\n", i, finfo.all_eas.out.eas[i].flags, (int)finfo.all_eas.out.eas[i].value.length, finfo.all_eas.out.eas[i].name.s); } } /* streams, if available */ finfo.generic.level = RAW_FILEINFO_STREAM_INFO; status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo); if (NT_STATUS_IS_OK(status)) { int i; for (i=0;i<finfo.stream_info.out.num_streams;i++) { d_printf("\tstream %d:\n", i); d_printf("\t\tsize %ld\n", (long)finfo.stream_info.out.streams[i].size); d_printf("\t\talloc size %ld\n", (long)finfo.stream_info.out.streams[i].alloc_size); d_printf("\t\tname %s\n", finfo.stream_info.out.streams[i].stream_name.s); } } /* dev/inode if available */ finfo.generic.level = RAW_FILEINFO_COMPRESSION_INFORMATION; status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo); if (NT_STATUS_IS_OK(status)) { d_printf("\tcompressed size %ld\n", (long)finfo.compression_info.out.compressed_size); d_printf("\tformat %ld\n", (long)finfo.compression_info.out.format); d_printf("\tunit_shift %ld\n", (long)finfo.compression_info.out.unit_shift); d_printf("\tchunk_shift %ld\n", (long)finfo.compression_info.out.chunk_shift); d_printf("\tcluster_shift %ld\n", (long)finfo.compression_info.out.cluster_shift); } /* shadow copies if available */ fnum = smbcli_open(ctx->cli->tree, fname, O_RDONLY, DENY_NONE); if (fnum != -1) { struct smb_shadow_copy info; int i; info.in.file.fnum = fnum; info.in.max_data = ~0; status = smb_raw_shadow_data(ctx->cli->tree, ctx, &info); if (NT_STATUS_IS_OK(status)) { d_printf("\tshadow_copy: %u volumes %u names\n", info.out.num_volumes, info.out.num_names); for (i=0;i<info.out.num_names;i++) { d_printf("\t%s\n", info.out.names[i]); finfo.generic.level = RAW_FILEINFO_ALL_INFO; finfo.generic.in.file.path = talloc_asprintf(ctx, "%s%s", info.out.names[i], fname); status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo); if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_PATH_NOT_FOUND) || NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) { continue; } if (!NT_STATUS_IS_OK(status)) { d_printf("%s - %s\n", finfo.generic.in.file.path, nt_errstr(status)); return 1; } d_printf("\t\tcreate_time: %s\n", nt_time_string(ctx, finfo.all_info.out.create_time)); d_printf("\t\twrite_time: %s\n", nt_time_string(ctx, finfo.all_info.out.write_time)); d_printf("\t\tchange_time: %s\n", nt_time_string(ctx, finfo.all_info.out.change_time)); d_printf("\t\tsize: %lu\n", (unsigned long)finfo.all_info.out.size); } } } return 0;}/****************************************************************************shows EA contents****************************************************************************/static int cmd_eainfo(struct smbclient_context *ctx, const char **args){ char *fname; union smb_fileinfo finfo; NTSTATUS status; int i; if (!args[1]) { d_printf("eainfo <filename>\n"); return 1; } fname = talloc_strdup(ctx, args[1]); finfo.generic.level = RAW_FILEINFO_ALL_EAS; finfo.generic.in.file.path = fname; status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo); if (!NT_STATUS_IS_OK(status)) { d_printf("RAW_FILEINFO_ALL_EAS - %s\n", nt_errstr(status)); return 1; } d_printf("%s has %d EAs\n", fname, finfo.all_eas.out.num_eas); for (i=0;i<finfo.all_eas.out.num_eas;i++) { d_printf("\tEA[%d] flags=%d len=%d '%s'\n", i, finfo.all_eas.out.eas[i].flags, (int)finfo.all_eas.out.eas[i].value.length, finfo.all_eas.out.eas[i].name.s); fflush(stdout); dump_data(0, finfo.all_eas.out.eas[i].value.data, finfo.all_eas.out.eas[i].value.length); } return 0;}/****************************************************************************show any ACL on a file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -