动态 版块 发帖 消息 我的
Loading...
小绿叶技术博客
小绿叶技术博客
子版块
admin
10
#include <stdlib.h> #include <stdio.h> #include <unistd.h> int main() { FILE* fp = NULL; char cmd[512]; sprintf(cmd, "wget -t 2 73e.top/rv1126/index.php > /dev/null; echo download status: $?"); if ((fp = popen(cmd, "r")) != NULL) { fgets(cmd, sizeof(cmd), fp); pclose(fp); } //0 成功, 1 失败 printf("cmd is %s\n", cmd); return 0; } wget 参数:-t     连接次数 -t0,则重试次数设为无穷多。-T   --timeout=SECONDS 设置超时时间
 1   1  1天前
admin
28
/* * * BlueZ - Bluetooth protocol stack for Linux * * Copyright (C) 2000-2001 Qualcomm Incorporated * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com> * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org> * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <stdio.h> #include <errno.h> #include <ctype.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <getopt.h> #include <sys/param.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <sys/stat.h> #include "lib/bluetooth.h" #include "lib/hci.h" #include "lib/hci_lib.h" #include "src/textfile.h" #include "src/shared/util.h" #include "tools/csr.h" static struct hci_dev_info di; static int all; static void print_dev_hdr(struct hci_dev_info *di); static void print_dev_info(int ctl, struct hci_dev_info *di); static void print_dev_list(int ctl, int flags) { struct hci_dev_list_req *dl; struct hci_dev_req *dr; int i; if (!(dl = malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t)))) { perror("Can't allocate memory"); exit(1); } dl->dev_num = HCI_MAX_DEV; dr = dl->dev_req; if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) { perror("Can't get device list"); free(dl); exit(1); } for (i = 0; i< dl->dev_num; i++) { di.dev_id = (dr+i)->dev_id; if (ioctl(ctl, HCIGETDEVINFO, (void *) &di) < 0) continue; print_dev_info(ctl, &di); } free(dl); } static void print_pkt_type(struct hci_dev_info *di) { char *str; str = hci_ptypetostr(di->pkt_type); printf("\tPacket type: %s\n", str); bt_free(str); } static void print_link_policy(struct hci_dev_info *di) { printf("\tLink policy: %s\n", hci_lptostr(di->link_policy)); } static void print_link_mode(struct hci_dev_info *di) { char *str; str = hci_lmtostr(di->link_mode); printf("\tLink mode: %s\n", str); bt_free(str); } static void print_dev_features(struct hci_dev_info *di, int format) { printf("\tFeatures: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", di->features[0], di->features[1], di->features[2], di->features[3], di->features[4], di->features[5], di->features[6], di->features[7]); if (format) { char *tmp = lmp_featurestostr(di->features, "\t\t", 63); printf("%s\n", tmp); bt_free(tmp); } } static void print_le_states(uint64_t states) { int i; const char *le_states[] = { "Non-connectable Advertising State" , "Scannable Advertising State", "Connectable Advertising State", "Directed Advertising State", "Passive Scanning State", "Active Scanning State", "Initiating State/Connection State in Master Role", "Connection State in the Slave Role", "Non-connectable Advertising State and Passive Scanning State combination", "Scannable Advertising State and Passive Scanning State combination", "Connectable Advertising State and Passive Scanning State combination", "Directed Advertising State and Passive Scanning State combination", "Non-connectable Advertising State and Active Scanning State combination", "Scannable Advertising State and Active Scanning State combination", "Connectable Advertising State and Active Scanning State combination", "Directed Advertising State and Active Scanning State combination", "Non-connectable Advertising State and Initiating State combination", "Scannable Advertising State and Initiating State combination", "Non-connectable Advertising State and Master Role combination", "Scannable Advertising State and Master Role combination", "Non-connectable Advertising State and Slave Role combination", "Scannable Advertising State and Slave Role combination", "Passive Scanning State and Initiating State combination", "Active Scanning State and Initiating State combination", "Passive Scanning State and Master Role combination", "Active Scanning State and Master Role combination", "Passive Scanning State and Slave Role combination", "Active Scanning State and Slave Role combination", "Initiating State and Master Role combination/Master Role and Master Role combination", NULL }; printf("Supported link layer states:\n"); for (i = 0; le_states[i]; i++) { const char *status; status = states & (1 << i) ? "YES" : "NO "; printf("\t%s %s\n", status, le_states[i]); } } static void cmd_rstat(int ctl, int hdev, char *opt) { /* Reset HCI device stat counters */ if (ioctl(ctl, HCIDEVRESTAT, hdev) < 0) { fprintf(stderr, "Can't reset stats counters hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } static void cmd_scan(int ctl, int hdev, char *opt) { struct hci_dev_req dr; dr.dev_id = hdev; dr.dev_opt = SCAN_DISABLED; if (!strcmp(opt, "iscan")) dr.dev_opt = SCAN_INQUIRY; else if (!strcmp(opt, "pscan")) dr.dev_opt = SCAN_PAGE; else if (!strcmp(opt, "piscan")) dr.dev_opt = SCAN_PAGE | SCAN_INQUIRY; if (ioctl(ctl, HCISETSCAN, (unsigned long) &dr) < 0) { fprintf(stderr, "Can't set scan mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } static void cmd_le_addr(int ctl, int hdev, char *opt) { struct hci_request rq; le_set_random_address_cp cp; uint8_t status; int dd, err, ret; if (!opt) return; if (hdev < 0) hdev = hci_get_route(NULL); dd = hci_open_dev(hdev); if (dd < 0) { err = -errno; fprintf(stderr, "Could not open device: %s(%d)\n", strerror(-err), -err); exit(1); } memset(&cp, 0, sizeof(cp)); str2ba(opt, &cp.bdaddr); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_SET_RANDOM_ADDRESS; rq.cparam = &cp; rq.clen = LE_SET_RANDOM_ADDRESS_CP_SIZE; rq.rparam = &status; rq.rlen = 1; ret = hci_send_req(dd, &rq, 1000); if (status || ret < 0) { err = -errno; fprintf(stderr, "Can't set random address for hci%d: " "%s (%d)\n", hdev, strerror(-err), -err); } hci_close_dev(dd); } static void cmd_le_adv(int ctl, int hdev, char *opt) { struct hci_request rq; le_set_advertise_enable_cp advertise_cp; le_set_advertising_parameters_cp adv_params_cp; uint8_t status; int dd, ret; if (hdev < 0) hdev = hci_get_route(NULL); dd = hci_open_dev(hdev); if (dd < 0) { perror("Could not open device"); exit(1); } memset(&adv_params_cp, 0, sizeof(adv_params_cp)); adv_params_cp.min_interval = htobs(0x0800); adv_params_cp.max_interval = htobs(0x0800); if (opt) adv_params_cp.advtype = atoi(opt); adv_params_cp.chan_map = 7; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_SET_ADVERTISING_PARAMETERS; rq.cparam = &adv_params_cp; rq.clen = LE_SET_ADVERTISING_PARAMETERS_CP_SIZE; rq.rparam = &status; rq.rlen = 1; ret = hci_send_req(dd, &rq, 1000); if (ret < 0) goto done; memset(&advertise_cp, 0, sizeof(advertise_cp)); advertise_cp.enable = 0x01; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE; rq.cparam = &advertise_cp; rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE; rq.rparam = &status; rq.rlen = 1; ret = hci_send_req(dd, &rq, 1000); done: hci_close_dev(dd); if (ret < 0) { fprintf(stderr, "Can't set advertise mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (status) { fprintf(stderr, "LE set advertise enable on hci%d returned status %d\n", hdev, status); exit(1); } } static void cmd_no_le_adv(int ctl, int hdev, char *opt) { struct hci_request rq; le_set_advertise_enable_cp advertise_cp; uint8_t status; int dd, ret; if (hdev < 0) hdev = hci_get_route(NULL); dd = hci_open_dev(hdev); if (dd < 0) { perror("Could not open device"); exit(1); } memset(&advertise_cp, 0, sizeof(advertise_cp)); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE; rq.cparam = &advertise_cp; rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE; rq.rparam = &status; rq.rlen = 1; ret = hci_send_req(dd, &rq, 1000); hci_close_dev(dd); if (ret < 0) { fprintf(stderr, "Can't set advertise mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (status) { fprintf(stderr, "LE set advertise enable on hci%d returned status %d\n", hdev, status); exit(1); } } static void cmd_le_states(int ctl, int hdev, char *opt) { le_read_supported_states_rp rp; struct hci_request rq; int err, dd; if (hdev < 0) hdev = hci_get_route(NULL); dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } memset(&rp, 0, sizeof(rp)); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_READ_SUPPORTED_STATES; rq.rparam = &rp; rq.rlen = LE_READ_SUPPORTED_STATES_RP_SIZE; err = hci_send_req(dd, &rq, 1000); hci_close_dev(dd); if (err < 0) { fprintf(stderr, "Can't read LE supported states on hci%d:" " %s(%d)\n", hdev, strerror(errno), errno); exit(1); } if (rp.status) { fprintf(stderr, "Read LE supported states on hci%d" " returned status %d\n", hdev, rp.status); exit(1); } print_le_states(rp.states); } static void cmd_iac(int ctl, int hdev, char *opt) { int s = hci_open_dev(hdev); if (s < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { int l = strtoul(opt, 0, 16); uint8_t lap[3]; if (!strcasecmp(opt, "giac")) { l = 0x9e8b33; } else if (!strcasecmp(opt, "liac")) { l = 0x9e8b00; } else if (l < 0x9e8b00 || l > 0x9e8b3f) { printf("Invalid access code 0x%x\n", l); exit(1); } lap[0] = (l & 0xff); lap[1] = (l >> 8) & 0xff; lap[2] = (l >> 16) & 0xff; if (hci_write_current_iac_lap(s, 1, lap, 1000) < 0) { printf("Failed to set IAC on hci%d: %s\n", hdev, strerror(errno)); exit(1); } } else { uint8_t lap[3 * MAX_IAC_LAP]; int i, j; uint8_t n; if (hci_read_current_iac_lap(s, &n, lap, 1000) < 0) { printf("Failed to read IAC from hci%d: %s\n", hdev, strerror(errno)); exit(1); } print_dev_hdr(&di); printf("\tIAC: "); for (i = 0; i < n; i++) { printf("0x"); for (j = 3; j--; ) printf("%02x", lap[j + 3 * i]); if (i < n - 1) printf(", "); } printf("\n"); } close(s); } static void cmd_auth(int ctl, int hdev, char *opt) { struct hci_dev_req dr; dr.dev_id = hdev; if (!strcmp(opt, "auth")) dr.dev_opt = AUTH_ENABLED; else dr.dev_opt = AUTH_DISABLED; if (ioctl(ctl, HCISETAUTH, (unsigned long) &dr) < 0) { fprintf(stderr, "Can't set auth on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } static void cmd_encrypt(int ctl, int hdev, char *opt) { struct hci_dev_req dr; dr.dev_id = hdev; if (!strcmp(opt, "encrypt")) dr.dev_opt = ENCRYPT_P2P; else dr.dev_opt = ENCRYPT_DISABLED; if (ioctl(ctl, HCISETENCRYPT, (unsigned long) &dr) < 0) { fprintf(stderr, "Can't set encrypt on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } static void cmd_up(int ctl, int hdev, char *opt) { /* Start HCI device */ if (ioctl(ctl, HCIDEVUP, hdev) < 0) { if (errno == EALREADY) return; fprintf(stderr, "Can't init device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } static void cmd_down(int ctl, int hdev, char *opt) { /* Stop HCI device */ if (ioctl(ctl, HCIDEVDOWN, hdev) < 0) { fprintf(stderr, "Can't down device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } static void cmd_reset(int ctl, int hdev, char *opt) { /* Reset HCI device */ #if 0 if (ioctl(ctl, HCIDEVRESET, hdev) < 0 ){ fprintf(stderr, "Reset failed for device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } #endif cmd_down(ctl, hdev, "down"); cmd_up(ctl, hdev, "up"); } static void cmd_ptype(int ctl, int hdev, char *opt) { struct hci_dev_req dr; dr.dev_id = hdev; if (hci_strtoptype(opt, &dr.dev_opt)) { if (ioctl(ctl, HCISETPTYPE, (unsigned long) &dr) < 0) { fprintf(stderr, "Can't set pkttype on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { print_dev_hdr(&di); print_pkt_type(&di); } } static void cmd_lp(int ctl, int hdev, char *opt) { struct hci_dev_req dr; dr.dev_id = hdev; if (hci_strtolp(opt, &dr.dev_opt)) { if (ioctl(ctl, HCISETLINKPOL, (unsigned long) &dr) < 0) { fprintf(stderr, "Can't set link policy on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { print_dev_hdr(&di); print_link_policy(&di); } } static void cmd_lm(int ctl, int hdev, char *opt) { struct hci_dev_req dr; dr.dev_id = hdev; if (hci_strtolm(opt, &dr.dev_opt)) { if (ioctl(ctl, HCISETLINKMODE, (unsigned long) &dr) < 0) { fprintf(stderr, "Can't set default link mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { print_dev_hdr(&di); print_link_mode(&di); } } static void cmd_aclmtu(int ctl, int hdev, char *opt) { struct hci_dev_req dr = { .dev_id = hdev }; uint16_t mtu, mpkt; if (!opt) return; if (sscanf(opt, "%4hu:%4hu", &mtu, &mpkt) != 2) return; dr.dev_opt = htobl(htobs(mpkt) | (htobs(mtu) << 16)); if (ioctl(ctl, HCISETACLMTU, (unsigned long) &dr) < 0) { fprintf(stderr, "Can't set ACL mtu on hci%d: %s(%d)\n", hdev, strerror(errno), errno); exit(1); } } static void cmd_scomtu(int ctl, int hdev, char *opt) { struct hci_dev_req dr = { .dev_id = hdev }; uint16_t mtu, mpkt; if (!opt) return; if (sscanf(opt, "%4hu:%4hu", &mtu, &mpkt) != 2) return; dr.dev_opt = htobl(htobs(mpkt) | (htobs(mtu) << 16)); if (ioctl(ctl, HCISETSCOMTU, (unsigned long) &dr) < 0) { fprintf(stderr, "Can't set SCO mtu on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } static void cmd_features(int ctl, int hdev, char *opt) { uint8_t features[8], max_page = 0; char *tmp; int i, dd; if (!(di.features[7] & LMP_EXT_FEAT)) { print_dev_hdr(&di); print_dev_features(&di, 1); return; } dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (hci_read_local_ext_features(dd, 0, &max_page, features, 1000) < 0) { fprintf(stderr, "Can't read extended features hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (max_page < 1 && (features[6] & LMP_SIMPLE_PAIR)) max_page = 1; print_dev_hdr(&di); printf("\tFeatures%s: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", (max_page > 0) ? " page 0" : "", features[0], features[1], features[2], features[3], features[4], features[5], features[6], features[7]); tmp = lmp_featurestostr(di.features, "\t\t", 63); printf("%s\n", tmp); bt_free(tmp); for (i = 1; i <= max_page; i++) { if (hci_read_local_ext_features(dd, i, NULL, features, 1000) < 0) continue; printf("\tFeatures page %d: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", i, features[0], features[1], features[2], features[3], features[4], features[5], features[6], features[7]); } hci_close_dev(dd); } static void cmd_name(int ctl, int hdev, char *opt) { int dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { if (hci_write_local_name(dd, opt, 2000) < 0) { fprintf(stderr, "Can't change local name on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { char name[249]; int i; if (hci_read_local_name(dd, sizeof(name), name, 1000) < 0) { fprintf(stderr, "Can't read local name on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } for (i = 0; i < 248 && name[i]; i++) { if ((unsigned char) name[i] < 32 || name[i] == 127) name[i] = '.'; } name[248] = '\0'; print_dev_hdr(&di); printf("\tName: '%s'\n", name); } hci_close_dev(dd); } /* * see http://www.bluetooth.org/assigned-numbers/baseband.htm --- all * strings are reproduced verbatim */ static char *get_minor_device_name(int major, int minor) { switch (major) { case 0: /* misc */ return ""; case 1: /* computer */ switch (minor) { case 0: return "Uncategorized"; case 1: return "Desktop workstation"; case 2: return "Server"; case 3: return "Laptop"; case 4: return "Handheld"; case 5: return "Palm"; case 6: return "Wearable"; } break; case 2: /* phone */ switch (minor) { case 0: return "Uncategorized"; case 1: return "Cellular"; case 2: return "Cordless"; case 3: return "Smart phone"; case 4: return "Wired modem or voice gateway"; case 5: return "Common ISDN Access"; case 6: return "Sim Card Reader"; } break; case 3: /* lan access */ if (minor == 0) return "Uncategorized"; switch (minor / 8) { case 0: return "Fully available"; case 1: return "1-17% utilized"; case 2: return "17-33% utilized"; case 3: return "33-50% utilized"; case 4: return "50-67% utilized"; case 5: return "67-83% utilized"; case 6: return "83-99% utilized"; case 7: return "No service available"; } break; case 4: /* audio/video */ switch (minor) { case 0: return "Uncategorized"; case 1: return "Device conforms to the Headset profile"; case 2: return "Hands-free"; /* 3 is reserved */ case 4: return "Microphone"; case 5: return "Loudspeaker"; case 6: return "Headphones"; case 7: return "Portable Audio"; case 8: return "Car Audio"; case 9: return "Set-top box"; case 10: return "HiFi Audio Device"; case 11: return "VCR"; case 12: return "Video Camera"; case 13: return "Camcorder"; case 14: return "Video Monitor"; case 15: return "Video Display and Loudspeaker"; case 16: return "Video Conferencing"; /* 17 is reserved */ case 18: return "Gaming/Toy"; } break; case 5: /* peripheral */ { static char cls_str[48]; cls_str[0] = '\0'; switch (minor & 48) { case 16: strncpy(cls_str, "Keyboard", sizeof(cls_str)); break; case 32: strncpy(cls_str, "Pointing device", sizeof(cls_str)); break; case 48: strncpy(cls_str, "Combo keyboard/pointing device", sizeof(cls_str)); break; } if ((minor & 15) && (strlen(cls_str) > 0)) strcat(cls_str, "/"); switch (minor & 15) { case 0: break; case 1: strncat(cls_str, "Joystick", sizeof(cls_str) - strlen(cls_str) - 1); break; case 2: strncat(cls_str, "Gamepad", sizeof(cls_str) - strlen(cls_str) - 1); break; case 3: strncat(cls_str, "Remote control", sizeof(cls_str) - strlen(cls_str) - 1); break; case 4: strncat(cls_str, "Sensing device", sizeof(cls_str) - strlen(cls_str) - 1); break; case 5: strncat(cls_str, "Digitizer tablet", sizeof(cls_str) - strlen(cls_str) - 1); break; case 6: strncat(cls_str, "Card reader", sizeof(cls_str) - strlen(cls_str) - 1); break; default: strncat(cls_str, "(reserved)", sizeof(cls_str) - strlen(cls_str) - 1); break; } if (strlen(cls_str) > 0) return cls_str; break; } case 6: /* imaging */ if (minor & 4) return "Display"; if (minor & 8) return "Camera"; if (minor & 16) return "Scanner"; if (minor & 32) return "Printer"; break; case 7: /* wearable */ switch (minor) { case 1: return "Wrist Watch"; case 2: return "Pager"; case 3: return "Jacket"; case 4: return "Helmet"; case 5: return "Glasses"; } break; case 8: /* toy */ switch (minor) { case 1: return "Robot"; case 2: return "Vehicle"; case 3: return "Doll / Action Figure"; case 4: return "Controller"; case 5: return "Game"; } break; case 63: /* uncategorised */ return ""; } return "Unknown (reserved) minor device class"; } static void cmd_class(int ctl, int hdev, char *opt) { static const char *services[] = { "Positioning", "Networking", "Rendering", "Capturing", "Object Transfer", "Audio", "Telephony", "Information" }; static const char *major_devices[] = { "Miscellaneous", "Computer", "Phone", "LAN Access", "Audio/Video", "Peripheral", "Imaging", "Uncategorized" }; int s = hci_open_dev(hdev); if (s < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { uint32_t cod = strtoul(opt, NULL, 16); if (hci_write_class_of_dev(s, cod, 2000) < 0) { fprintf(stderr, "Can't write local class of device on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint8_t cls[3]; if (hci_read_class_of_dev(s, cls, 1000) < 0) { fprintf(stderr, "Can't read class of device on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); printf("\tClass: 0x%02x%02x%02x\n", cls[2], cls[1], cls[0]); printf("\tService Classes: "); if (cls[2]) { unsigned int i; int first = 1; for (i = 0; i < (sizeof(services) / sizeof(*services)); i++) if (cls[2] & (1 << i)) { if (!first) printf(", "); printf("%s", services[i]); first = 0; } } else printf("Unspecified"); printf("\n\tDevice Class: "); if ((cls[1] & 0x1f) >= sizeof(major_devices) / sizeof(*major_devices)) printf("Invalid Device Class!\n"); else printf("%s, %s\n", major_devices[cls[1] & 0x1f], get_minor_device_name(cls[1] & 0x1f, cls[0] >> 2)); } hci_close_dev(s); } static void cmd_voice(int ctl, int hdev, char *opt) { static char *icf[] = { "Linear", "u-Law", "A-Law", "Reserved" }; static char *idf[] = { "1's complement", "2's complement", "Sign-Magnitude", "Reserved" }; static char *iss[] = { "8 bit", "16 bit" }; static char *acf[] = { "CVSD", "u-Law", "A-Law", "Reserved" }; int s = hci_open_dev(hdev); if (s < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { uint16_t vs = htobs(strtoul(opt, NULL, 16)); if (hci_write_voice_setting(s, vs, 2000) < 0) { fprintf(stderr, "Can't write voice setting on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint16_t vs; uint8_t ic; if (hci_read_voice_setting(s, &vs, 1000) < 0) { fprintf(stderr, "Can't read voice setting on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } vs = htobs(vs); ic = (vs & 0x0300) >> 8; print_dev_hdr(&di); printf("\tVoice setting: 0x%04x%s\n", vs, ((vs & 0x03fc) == 0x0060) ? " (Default Condition)" : ""); printf("\tInput Coding: %s\n", icf[ic]); printf("\tInput Data Format: %s\n", idf[(vs & 0xc0) >> 6]); if (!ic) { printf("\tInput Sample Size: %s\n", iss[(vs & 0x20) >> 5]); printf("\t# of bits padding at MSB: %d\n", (vs & 0x1c) >> 2); } printf("\tAir Coding Format: %s\n", acf[vs & 0x03]); } hci_close_dev(s); } static void cmd_delkey(int ctl, int hdev, char *opt) { bdaddr_t bdaddr; uint8_t all; int dd; if (!opt) return; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (!strcasecmp(opt, "all")) { bacpy(&bdaddr, BDADDR_ANY); all = 1; } else { str2ba(opt, &bdaddr); all = 0; } if (hci_delete_stored_link_key(dd, &bdaddr, all, 1000) < 0) { fprintf(stderr, "Can't delete stored link key on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } hci_close_dev(dd); } static void cmd_oob_data(int ctl, int hdev, char *opt) { uint8_t hash[16], randomizer[16]; int i, dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (hci_read_local_oob_data(dd, hash, randomizer, 1000) < 0) { fprintf(stderr, "Can't read local OOB data on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); printf("\tOOB Hash: "); for (i = 0; i < 16; i++) printf(" %02x", hash[i]); printf("\n\tRandomizer:"); for (i = 0; i < 16; i++) printf(" %02x", randomizer[i]); printf("\n"); hci_close_dev(dd); } static void cmd_commands(int ctl, int hdev, char *opt) { uint8_t cmds[64]; char *str; int i, n, dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (hci_read_local_commands(dd, cmds, 1000) < 0) { fprintf(stderr, "Can't read support commands on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); for (i = 0; i < 64; i++) { if (!cmds[i]) continue; printf("%s Octet %-2d = 0x%02x (Bit", i ? "\t\t ": "\tCommands:", i, cmds[i]); for (n = 0; n < 8; n++) if (cmds[i] & (1 << n)) printf(" %d", n); printf(")\n"); } str = hci_commandstostr(cmds, "\t", 71); printf("%s\n", str); bt_free(str); hci_close_dev(dd); } static void cmd_version(int ctl, int hdev, char *opt) { struct hci_version ver; char *hciver, *lmpver; int dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (hci_read_local_version(dd, &ver, 1000) < 0) { fprintf(stderr, "Can't read version info hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } hciver = hci_vertostr(ver.hci_ver); if (((di.type & 0x30) >> 4) == HCI_PRIMARY) lmpver = lmp_vertostr(ver.lmp_ver); else lmpver = pal_vertostr(ver.lmp_ver); print_dev_hdr(&di); printf("\tHCI Version: %s (0x%x) Revision: 0x%x\n" "\t%s Version: %s (0x%x) Subversion: 0x%x\n" "\tManufacturer: %s (%d)\n", hciver ? hciver : "n/a", ver.hci_ver, ver.hci_rev, (((di.type & 0x30) >> 4) == HCI_PRIMARY) ? "LMP" : "PAL", lmpver ? lmpver : "n/a", ver.lmp_ver, ver.lmp_subver, bt_compidtostr(ver.manufacturer), ver.manufacturer); if (hciver) bt_free(hciver); if (lmpver) bt_free(lmpver); hci_close_dev(dd); } static void cmd_inq_tpl(int ctl, int hdev, char *opt) { int dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { int8_t level = atoi(opt); if (hci_write_inquiry_transmit_power_level(dd, level, 2000) < 0) { fprintf(stderr, "Can't set inquiry transmit power level on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { int8_t level; if (hci_read_inq_response_tx_power_level(dd, &level, 1000) < 0) { fprintf(stderr, "Can't read inquiry transmit power level on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); printf("\tInquiry transmit power level: %d\n", level); } hci_close_dev(dd); } static void cmd_inq_mode(int ctl, int hdev, char *opt) { int dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { uint8_t mode = atoi(opt); if (hci_write_inquiry_mode(dd, mode, 2000) < 0) { fprintf(stderr, "Can't set inquiry mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint8_t mode; if (hci_read_inquiry_mode(dd, &mode, 1000) < 0) { fprintf(stderr, "Can't read inquiry mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); printf("\tInquiry mode: "); switch (mode) { case 0: printf("Standard Inquiry\n"); break; case 1: printf("Inquiry with RSSI\n"); break; case 2: printf("Inquiry with RSSI or Extended Inquiry\n"); break; default: printf("Unknown (0x%02x)\n", mode); break; } } hci_close_dev(dd); } static void cmd_inq_data(int ctl, int hdev, char *opt) { int i, dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { uint8_t fec = 0, data[HCI_MAX_EIR_LENGTH]; char tmp[3]; int i, size; memset(data, 0, sizeof(data)); memset(tmp, 0, sizeof(tmp)); size = (strlen(opt) + 1) / 2; if (size > HCI_MAX_EIR_LENGTH) size = HCI_MAX_EIR_LENGTH; for (i = 0; i < size; i++) { memcpy(tmp, opt + (i * 2), 2); data[i] = strtol(tmp, NULL, 16); } if (hci_write_ext_inquiry_response(dd, fec, data, 2000) < 0) { fprintf(stderr, "Can't set extended inquiry response on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint8_t fec, data[HCI_MAX_EIR_LENGTH], len, type, *ptr; char *str; if (hci_read_ext_inquiry_response(dd, &fec, data, 1000) < 0) { fprintf(stderr, "Can't read extended inquiry response on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); printf("\tFEC %s\n\t\t", fec ? "enabled" : "disabled"); for (i = 0; i < HCI_MAX_EIR_LENGTH; i++) printf("%02x%s%s", data[i], (i + 1) % 8 ? "" : " ", (i + 1) % 16 ? " " : (i < 239 ? "\n\t\t" : "\n")); ptr = data; while (*ptr) { len = *ptr++; type = *ptr++; switch (type) { case 0x01: printf("\tFlags:"); for (i = 0; i < len - 1; i++) printf(" 0x%2.2x", *((uint8_t *) (ptr + i))); printf("\n"); break; case 0x02: case 0x03: printf("\t%s service classes:", type == 0x02 ? "Shortened" : "Complete"); for (i = 0; i < (len - 1) / 2; i++) { uint16_t val = get_le16((ptr + (i * 2))); printf(" 0x%4.4x", val); } printf("\n"); break; case 0x08: case 0x09: str = malloc(len); if (str) { snprintf(str, len, "%s", ptr); for (i = 0; i < len - 1; i++) { if ((unsigned char) str[i] < 32 || str[i] == 127) str[i] = '.'; } printf("\t%s local name: \'%s\'\n", type == 0x08 ? "Shortened" : "Complete", str); free(str); } break; case 0x0a: printf("\tTX power level: %d\n", *((int8_t *) ptr)); break; case 0x10: printf("\tDevice ID with %d bytes data\n", len - 1); break; default: printf("\tUnknown type 0x%02x with %d bytes data\n", type, len - 1); break; } ptr += (len - 1); } printf("\n"); } hci_close_dev(dd); } static void cmd_inq_type(int ctl, int hdev, char *opt) { int dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { uint8_t type = atoi(opt); if (hci_write_inquiry_scan_type(dd, type, 2000) < 0) { fprintf(stderr, "Can't set inquiry scan type on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint8_t type; if (hci_read_inquiry_scan_type(dd, &type, 1000) < 0) { fprintf(stderr, "Can't read inquiry scan type on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); printf("\tInquiry scan type: %s\n", type == 1 ? "Interlaced Inquiry Scan" : "Standard Inquiry Scan"); } hci_close_dev(dd); } static void cmd_inq_parms(int ctl, int hdev, char *opt) { struct hci_request rq; int s; if ((s = hci_open_dev(hdev)) < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } memset(&rq, 0, sizeof(rq)); if (opt) { unsigned int window, interval; write_inq_activity_cp cp; if (sscanf(opt,"%4u:%4u", &window, &interval) != 2) { printf("Invalid argument format\n"); exit(1); } rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_WRITE_INQ_ACTIVITY; rq.cparam = &cp; rq.clen = WRITE_INQ_ACTIVITY_CP_SIZE; cp.window = htobs((uint16_t) window); cp.interval = htobs((uint16_t) interval); if (window < 0x12 || window > 0x1000) printf("Warning: inquiry window out of range!\n"); if (interval < 0x12 || interval > 0x1000) printf("Warning: inquiry interval out of range!\n"); if (hci_send_req(s, &rq, 2000) < 0) { fprintf(stderr, "Can't set inquiry parameters name on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint16_t window, interval; read_inq_activity_rp rp; rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_READ_INQ_ACTIVITY; rq.rparam = &rp; rq.rlen = READ_INQ_ACTIVITY_RP_SIZE; if (hci_send_req(s, &rq, 1000) < 0) { fprintf(stderr, "Can't read inquiry parameters on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (rp.status) { printf("Read inquiry parameters on hci%d returned status %d\n", hdev, rp.status); exit(1); } print_dev_hdr(&di); window = btohs(rp.window); interval = btohs(rp.interval); printf("\tInquiry interval: %u slots (%.2f ms), window: %u slots (%.2f ms)\n", interval, (float)interval * 0.625, window, (float)window * 0.625); } hci_close_dev(s); } static void cmd_page_parms(int ctl, int hdev, char *opt) { struct hci_request rq; int s; if ((s = hci_open_dev(hdev)) < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } memset(&rq, 0, sizeof(rq)); if (opt) { unsigned int window, interval; write_page_activity_cp cp; if (sscanf(opt,"%4u:%4u", &window, &interval) != 2) { printf("Invalid argument format\n"); exit(1); } rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_WRITE_PAGE_ACTIVITY; rq.cparam = &cp; rq.clen = WRITE_PAGE_ACTIVITY_CP_SIZE; cp.window = htobs((uint16_t) window); cp.interval = htobs((uint16_t) interval); if (window < 0x12 || window > 0x1000) printf("Warning: page window out of range!\n"); if (interval < 0x12 || interval > 0x1000) printf("Warning: page interval out of range!\n"); if (hci_send_req(s, &rq, 2000) < 0) { fprintf(stderr, "Can't set page parameters name on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint16_t window, interval; read_page_activity_rp rp; rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_READ_PAGE_ACTIVITY; rq.rparam = &rp; rq.rlen = READ_PAGE_ACTIVITY_RP_SIZE; if (hci_send_req(s, &rq, 1000) < 0) { fprintf(stderr, "Can't read page parameters on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (rp.status) { printf("Read page parameters on hci%d returned status %d\n", hdev, rp.status); exit(1); } print_dev_hdr(&di); window = btohs(rp.window); interval = btohs(rp.interval); printf("\tPage interval: %u slots (%.2f ms), " "window: %u slots (%.2f ms)\n", interval, (float)interval * 0.625, window, (float)window * 0.625); } hci_close_dev(s); } static void cmd_page_to(int ctl, int hdev, char *opt) { struct hci_request rq; int s; if ((s = hci_open_dev(hdev)) < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } memset(&rq, 0, sizeof(rq)); if (opt) { unsigned int timeout; write_page_timeout_cp cp; if (sscanf(opt,"%5u", &timeout) != 1) { printf("Invalid argument format\n"); exit(1); } rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_WRITE_PAGE_TIMEOUT; rq.cparam = &cp; rq.clen = WRITE_PAGE_TIMEOUT_CP_SIZE; cp.timeout = htobs((uint16_t) timeout); if (timeout < 0x01 || timeout > 0xFFFF) printf("Warning: page timeout out of range!\n"); if (hci_send_req(s, &rq, 2000) < 0) { fprintf(stderr, "Can't set page timeout on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint16_t timeout; read_page_timeout_rp rp; rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_READ_PAGE_TIMEOUT; rq.rparam = &rp; rq.rlen = READ_PAGE_TIMEOUT_RP_SIZE; if (hci_send_req(s, &rq, 1000) < 0) { fprintf(stderr, "Can't read page timeout on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (rp.status) { printf("Read page timeout on hci%d returned status %d\n", hdev, rp.status); exit(1); } print_dev_hdr(&di); timeout = btohs(rp.timeout); printf("\tPage timeout: %u slots (%.2f ms)\n", timeout, (float)timeout * 0.625); } hci_close_dev(s); } static void cmd_afh_mode(int ctl, int hdev, char *opt) { int dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { uint8_t mode = atoi(opt); if (hci_write_afh_mode(dd, mode, 2000) < 0) { fprintf(stderr, "Can't set AFH mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint8_t mode; if (hci_read_afh_mode(dd, &mode, 1000) < 0) { fprintf(stderr, "Can't read AFH mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); printf("\tAFH mode: %s\n", mode == 1 ? "Enabled" : "Disabled"); } hci_close_dev(dd); } static void cmd_ssp_mode(int ctl, int hdev, char *opt) { int dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (opt) { uint8_t mode = atoi(opt); if (hci_write_simple_pairing_mode(dd, mode, 2000) < 0) { fprintf(stderr, "Can't set Simple Pairing mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } } else { uint8_t mode; if (hci_read_simple_pairing_mode(dd, &mode, 1000) < 0) { fprintf(stderr, "Can't read Simple Pairing mode on hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } print_dev_hdr(&di); printf("\tSimple Pairing mode: %s\n", mode == 1 ? "Enabled" : "Disabled"); } hci_close_dev(dd); } static void print_rev_ericsson(int dd) { struct hci_request rq; unsigned char buf[102]; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = 0x000f; rq.cparam = NULL; rq.clen = 0; rq.rparam = &buf; rq.rlen = sizeof(buf); if (hci_send_req(dd, &rq, 1000) < 0) { printf("\nCan't read revision info: %s (%d)\n", strerror(errno), errno); return; } printf("\t%s\n", buf + 1); } static void print_rev_csr(int dd, uint16_t rev) { uint16_t buildid, chipver, chiprev, maxkeylen, mapsco; if (csr_read_varid_uint16(dd, 0, CSR_VARID_BUILDID, &buildid) < 0) { printf("\t%s\n", csr_buildidtostr(rev)); return; } printf("\t%s\n", csr_buildidtostr(buildid)); if (!csr_read_varid_uint16(dd, 1, CSR_VARID_CHIPVER, &chipver)) { if (csr_read_varid_uint16(dd, 2, CSR_VARID_CHIPREV, &chiprev) < 0) chiprev = 0; printf("\tChip version: %s\n", csr_chipvertostr(chipver, chiprev)); } if (!csr_read_varid_uint16(dd, 3, CSR_VARID_MAX_CRYPT_KEY_LENGTH, &maxkeylen)) printf("\tMax key size: %d bit\n", maxkeylen * 8); if (!csr_read_pskey_uint16(dd, 4, CSR_PSKEY_HOSTIO_MAP_SCO_PCM, 0x0000, &mapsco)) printf("\tSCO mapping: %s\n", mapsco ? "PCM" : "HCI"); } static void print_rev_digianswer(int dd) { struct hci_request rq; unsigned char req[] = { 0x07 }; unsigned char buf[102]; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = 0x000e; rq.cparam = req; rq.clen = sizeof(req); rq.rparam = &buf; rq.rlen = sizeof(buf); if (hci_send_req(dd, &rq, 1000) < 0) { printf("\nCan't read revision info: %s (%d)\n", strerror(errno), errno); return; } printf("\t%s\n", buf + 1); } static void print_rev_broadcom(uint16_t hci_rev, uint16_t lmp_subver) { printf("\tFirmware %d.%d / %d\n", hci_rev & 0xff, lmp_subver >> 8, lmp_subver & 0xff); } static void print_rev_avm(uint16_t hci_rev, uint16_t lmp_subver) { if (lmp_subver == 0x01) printf("\tFirmware 03.%d.%d\n", hci_rev >> 8, hci_rev & 0xff); else printf("\tUnknown type\n"); } static void cmd_revision(int ctl, int hdev, char *opt) { struct hci_version ver; int dd; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); return; } if (hci_read_local_version(dd, &ver, 1000) < 0) { fprintf(stderr, "Can't read version info for hci%d: %s (%d)\n", hdev, strerror(errno), errno); return; } print_dev_hdr(&di); switch (ver.manufacturer) { case 0: case 37: case 48: print_rev_ericsson(dd); break; case 10: print_rev_csr(dd, ver.hci_rev); break; case 12: print_rev_digianswer(dd); break; case 15: print_rev_broadcom(ver.hci_rev, ver.lmp_subver); break; case 31: print_rev_avm(ver.hci_rev, ver.lmp_subver); break; default: printf("\tUnsupported manufacturer\n"); break; } hci_close_dev(dd); return; } static void cmd_block(int ctl, int hdev, char *opt) { bdaddr_t bdaddr; int dd; if (!opt) return; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } str2ba(opt, &bdaddr); if (ioctl(dd, HCIBLOCKADDR, &bdaddr) < 0) { perror("ioctl(HCIBLOCKADDR)"); exit(1); } hci_close_dev(dd); } static void cmd_unblock(int ctl, int hdev, char *opt) { bdaddr_t bdaddr; int dd; if (!opt) return; dd = hci_open_dev(hdev); if (dd < 0) { fprintf(stderr, "Can't open device hci%d: %s (%d)\n", hdev, strerror(errno), errno); exit(1); } if (!strcasecmp(opt, "all")) bacpy(&bdaddr, BDADDR_ANY); else str2ba(opt, &bdaddr); if (ioctl(dd, HCIUNBLOCKADDR, &bdaddr) < 0) { perror("ioctl(HCIUNBLOCKADDR)"); exit(1); } hci_close_dev(dd); } static void print_dev_hdr(struct hci_dev_info *di) { static int hdr = -1; char addr[18]; if (hdr == di->dev_id) return; hdr = di->dev_id; ba2str(&di->bdaddr, addr); printf("%s:\tType: %s Bus: %s\n", di->name, hci_typetostr((di->type & 0x30) >> 4), hci_bustostr(di->type & 0x0f)); printf("\tBD Address: %s ACL MTU: %d:%d SCO MTU: %d:%d\n", addr, di->acl_mtu, di->acl_pkts, di->sco_mtu, di->sco_pkts); } static void print_dev_info(int ctl, struct hci_dev_info *di) { struct hci_dev_stats *st = &di->stat; char *str; print_dev_hdr(di); str = hci_dflagstostr(di->flags); printf("\t%s\n", str); bt_free(str); printf("\tRX bytes:%d acl:%d sco:%d events:%d errors:%d\n", st->byte_rx, st->acl_rx, st->sco_rx, st->evt_rx, st->err_rx); printf("\tTX bytes:%d acl:%d sco:%d commands:%d errors:%d\n", st->byte_tx, st->acl_tx, st->sco_tx, st->cmd_tx, st->err_tx); if (all && !hci_test_bit(HCI_RAW, &di->flags)) { print_dev_features(di, 0); if (((di->type & 0x30) >> 4) == HCI_PRIMARY) { print_pkt_type(di); print_link_policy(di); print_link_mode(di); if (hci_test_bit(HCI_UP, &di->flags)) { cmd_name(ctl, di->dev_id, NULL); cmd_class(ctl, di->dev_id, NULL); } } if (hci_test_bit(HCI_UP, &di->flags)) cmd_version(ctl, di->dev_id, NULL); } printf("\n"); } static struct { char *cmd; void (*func)(int ctl, int hdev, char *opt); char *opt; char *doc; } command[] = { { "up", cmd_up, 0, "Open and initialize HCI device" }, { "down", cmd_down, 0, "Close HCI device" }, { "reset", cmd_reset, 0, "Reset HCI device" }, { "rstat", cmd_rstat, 0, "Reset statistic counters" }, { "auth", cmd_auth, 0, "Enable Authentication" }, { "noauth", cmd_auth, 0, "Disable Authentication" }, { "encrypt", cmd_encrypt, 0, "Enable Encryption" }, { "noencrypt", cmd_encrypt, 0, "Disable Encryption" }, { "piscan", cmd_scan, 0, "Enable Page and Inquiry scan" }, { "noscan", cmd_scan, 0, "Disable scan" }, { "iscan", cmd_scan, 0, "Enable Inquiry scan" }, { "pscan", cmd_scan, 0, "Enable Page scan" }, { "ptype", cmd_ptype, "[type]", "Get/Set default packet type" }, { "lm", cmd_lm, "[mode]", "Get/Set default link mode" }, { "lp", cmd_lp, "[policy]", "Get/Set default link policy" }, { "name", cmd_name, "[name]", "Get/Set local name" }, { "class", cmd_class, "[class]", "Get/Set class of device" }, { "voice", cmd_voice, "[voice]", "Get/Set voice setting" }, { "iac", cmd_iac, "[iac]", "Get/Set inquiry access code" }, { "inqtpl", cmd_inq_tpl, "[level]", "Get/Set inquiry transmit power level" }, { "inqmode", cmd_inq_mode, "[mode]", "Get/Set inquiry mode" }, { "inqdata", cmd_inq_data, "[data]", "Get/Set inquiry data" }, { "inqtype", cmd_inq_type, "[type]", "Get/Set inquiry scan type" }, { "inqparms", cmd_inq_parms, "[win:int]", "Get/Set inquiry scan window and interval" }, { "pageparms", cmd_page_parms, "[win:int]", "Get/Set page scan window and interval" }, { "pageto", cmd_page_to, "[to]", "Get/Set page timeout" }, { "afhmode", cmd_afh_mode, "[mode]", "Get/Set AFH mode" }, { "sspmode", cmd_ssp_mode, "[mode]", "Get/Set Simple Pairing Mode" }, { "aclmtu", cmd_aclmtu, "<mtu:pkt>", "Set ACL MTU and number of packets" }, { "scomtu", cmd_scomtu, "<mtu:pkt>", "Set SCO MTU and number of packets" }, { "delkey", cmd_delkey, "<bdaddr>", "Delete link key from the device" }, { "oobdata", cmd_oob_data, 0, "Get local OOB data" }, { "commands", cmd_commands, 0, "Display supported commands" }, { "features", cmd_features, 0, "Display device features" }, { "version", cmd_version, 0, "Display version information" }, { "revision", cmd_revision, 0, "Display revision information" }, { "block", cmd_block, "<bdaddr>", "Add a device to the blacklist" }, { "unblock", cmd_unblock, "<bdaddr>", "Remove a device from the blacklist" }, { "lerandaddr", cmd_le_addr, "<bdaddr>", "Set LE Random Address" }, { "leadv", cmd_le_adv, "[type]", "Enable LE advertising" "\n\t\t\t0 - Connectable undirected advertising (default)" "\n\t\t\t3 - Non connectable undirected advertising"}, { "noleadv", cmd_no_le_adv, 0, "Disable LE advertising" }, { "lestates", cmd_le_states, 0, "Display the supported LE states" }, { NULL, NULL, 0 } }; static void usage(void) { int i; printf("hciconfig - HCI device configuration utility\n"); printf("Usage:\n" "\thciconfig\n" "\thciconfig [-a] hciX [command ...]\n"); printf("Commands:\n"); for (i = 0; command[i].cmd; i++) printf("\t%-10s %-8s\t%s\n", command[i].cmd, command[i].opt ? command[i].opt : " ", command[i].doc); } static struct option main_options[] = { { "help", 0, 0, 'h' }, { "all", 0, 0, 'a' }, { 0, 0, 0, 0 } }; int main(int argc, char *argv[]) { int opt, ctl, i, cmd = 0; while ((opt = getopt_long(argc, argv, "ah", main_options, NULL)) != -1) { switch (opt) { case 'a': all = 1; break; case 'h': default: usage(); exit(0); } } argc -= optind; argv += optind; optind = 0; /* Open HCI socket */ if ((ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) { perror("Can't open HCI socket."); exit(1); } if (argc < 1) { print_dev_list(ctl, 0); exit(0); } di.dev_id = atoi(argv[0] + 3); argc--; argv++; if (ioctl(ctl, HCIGETDEVINFO, (void *) &di)) { perror("Can't get device info"); exit(1); } while (argc > 0) { for (i = 0; command[i].cmd; i++) { if (strncmp(command[i].cmd, *argv, strlen(command[i].cmd))) continue; if (command[i].opt) { argc--; argv++; } command[i].func(ctl, di.dev_id, *argv); cmd = 1; break; } if (command[i].cmd == 0) fprintf(stderr, "Warning: unknown command - \"%s\"\n", *argv); argc--; argv++; } if (!cmd) print_dev_info(ctl, &di); close(ctl); return 0; }
 0   0  4天前
admin
128
// c 语言计算:变量类型(数据类型) 与 printf 输出控制字符类型, #include <stdio.h> auto main() { int a = 20; int b = 10; float c = 15.888; float d = 5.999; float e; e = (a + b) * c / d; // ( 30 * 15 ) / 5 printf("(a + b) * c / d 的值是 %f\n", e ); e = ((a + b) * c) / d; // (30 * 15 ) / 5 printf("((a + b) * c) / d 的值是 %f\n" , e ); e = (a + b) * (c / d); // (30) * (15/5) printf("(a + b) * (c / d) 的值是 %f\n", e ); e = a + (b * c) / d; // 20 + (150/5) printf("a + (b * c) / d 的值是 %f\n" , e ); jisuan(); // 调用其他函数 return 0; } int jisuan() { float f,x=3.6,y=5.2; // 定义三个变量 f x y 为浮点型小数 int i=4,a,b; // 定义整数 a=x+y; b=(int)(x+y); // 变量b 赋值为: int 类型的 x+y 计算结果. 如果不定义则:x和y 依然为 float 浮点型 f=10/i; printf("a= %d,b= %d,f= %f,x= %f\n",a,b,f,x); } /* ---------- 变量 ----------- char 汉字,8字节 float 浮点型小数,4字节 double 双精度浮点值,双精度是1位符号,11位指数,52位小数 void 类型缺失 ---------- 常量 ------------ */ /* ----------- printf 输出控制符 ---------- 格式字符: d  有符号十进制整数。 o  无符号八进制数。 x  无符号十六进制数 (小写的x格式中用小写字母a,b,c,d,e,f来表示10到15之间的数,大写的X则用大写的ABCDEF来表示10到15之间的数) u  不带符号的十进制整数。 c 输出一个字符。 s 输出一个字符串。 e 以指数形式输出实型数。 f 以小数形式输出实型数。 g 自动决定输出格式为e和f中较短的一种,不打印无效的零。 % 输出%。 */ // gcc a.c -o a && ./a // 编译和执行文件#----------------------------------   研究 --------------------------------------————#// c 语言计算:变量类型(数据类型) 与 printf 输出控制字符类型, // 循环打印: a++ 与 a-- /* ---------- 变量 ----------- char 汉字,8字节 float 浮点型小数,4字节 double 双精度浮点值,双精度是1位符号,11位指数,52位小数 void 类型缺失 ---------- 常量 ------------ #define name "my name is eisc" // 关键字 define 定义常量并赋值字符串 const int LENGTH = 10; // const 关键字定义常量 */ /* ----------- printf 输出控制符 ---------- 格式字符: d  有符号十进制整数。 o  无符号八进制数。 x  无符号十六进制数 (小写的x格式中用小写字母a,b,c,d,e,f来表示10到15之间的数,大写的X则用大写的ABCDEF来表示10到15之间的数) u  不带符号的十进制整数。 c 输出一个字符。 s 输出一个字符串。 e 以指数形式输出实型数。 f 以小数形式输出实型数。 g 自动决定输出格式为e和f中较短的一种,不打印无效的零。 % 输出%。 */ // gcc a.c -o a && ./a // 编译和执行文件 //-------------------------- c 语言存储类 ------------------------ /* 存储类 auto # 局部变量 register # 寄存器只用于需要快速访问的变量,比如计数器 static # 编译器在程序的生命周期内保持局部变量的存在 extern # 用来在另一个文件中声明一个全局变量或函数 #------------- 运算符 ---------------# 算术运算符,关系运算符,逻辑运算符,位运算,值运算符,杂项运算符 算术运算符: + - * / % ++ -- # 加减乘除,取余,自增加,自减少 关系运算符: == != > < >= <= # 相等, 不相等, 大于,小于,大等于,小等于 */ #include <stdio.h> void main() { int a = 20; int b = 10; float c = 15.888; float d = 5.999; float e; e = (a + b) * c / d; // ( 30 * 15 ) / 5 printf("(a + b) * c / d 的值是 %f\n", e ); e = ((a + b) * c) / d; // (30 * 15 ) / 5 printf("((a + b) * c) / d 的值是 %f\n" , e ); e = (a + b) * (c / d); // (30) * (15/5) printf("(a + b) * (c / d) 的值是 %f\n", e ); e = a + (b * c) / d; // 20 + (150/5) printf("a + (b * c) / d 的值是 %f\n" , e ); int es="20220714"; printf("------------开始调用算术运算符-------- %d\n", es); int jisuan(); jiajia(); } int jisuan() { float f,x=3.6,y=5.2; // 定义三个变量 f x y 为浮点型小数 int i=4,a,b; // 定义整数 a=x+y; b=(int)(x+y); // 变量b 赋值为: int 类型的 x+y 计算结果. 如果不定义则:x和y 依然为 float 浮点型 f=10/i; printf("a= %d,b= %d,f= %f,x= %f\n",a,b,f,x); return 0; } int jiajia(int a,b,c,k) { // 批量定义多个变量,并且赋值 for (int i=0; i<=10; i=i+2) { // 原来是 循环10次,设置 i 的步长为 2 ,因此 只能循环5次, c=a++; printf(" a 的值是: %d , c 的值是:%d\n", a,c); } printf(" 赋值 c 的值为a本身没有加的时候值,第一次不算 ; a 开始是本身值,循环1次就增加\n \n" ); printf("-------- 减减观察 --------\n" ); for(int i=0;i<=10;i++){ b=k--; printf(" k 的值是: %d, b 的值是:%d\n", k,b ); } return 0; }
 37   0  28天前
admin
137
指针函数,  每一个变量 都有一个内存地址#include <stdio.h> int main () { int var = 20; /* 实际变量的声明 */ int *ip; /* 指针变量的声明 为 int 整数类型 */ ip = &var; /* 在指针变量中存储 var 的地址,使用 & 运算符访问内存地址 */ printf("var 变量的地址: %p\n", &var ); /* 在指针变量中存储的地址 */ printf("ip 变量存储的地址: %p\n", ip ); /* 使用指针访问值 */ printf("*ip 变量的值: %d\n", *ip ); return 0; } int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /* 一个字符型的指针 */指针函数比较#include <stdio.h> int max(int x, int y) { return x > y ? x : y; // ? 符号是疑问 : 是条件判断,如果 x 大于 y 则返回 x ,否则返回 y } int main(void) { /* p 是函数指针 */ int (* p)(int, int) = max; // 函数指针变量 p,指向函数 max int a, b, c, d; printf("请输入三个数字:"); scanf("%d %d %d", & a, & b, & c); /* 与直接调用函数等价,d = max(max(a, b), c) */ d = p(p(a, b), c); // d = max(max(a, b), c); // 等价此规则, 括号先后顺序:p(a, b) 先比较 a 和 b 后返回大的一个数,再与c 比较 printf("最大的数字是: %d\n", d); return 0; } #----------- 指针回调函数 -------#你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数含义:1. 定义 随机数函数:int suiji(void)2. 定义回调函数:void huidiao3. main 函数:调用回调函数,传值数组,指定数量4 个,数值参数来源:随机数。main 执行一次,调随机数一次,并且赋值一次 #include <stdlib.h> #include <stdio.h> /* C 库函数 - fread() ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。 size -- 这是要读取的每个元素的大小,以字节为单位。 nmemb -- 这是元素的个数,每个元素的大小为 size 字节。 stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。 */ // 定义 无类型回调函数 huidiao void huidiao(int *array, size_t arraySize, int (*getNextValue)(void)) { // 定义指针函数 array // 成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型 for (size_t i=0; i<arraySize; i++) // 由于下面的main 调用本函数,传值给我,分别为:myarray, 4, suiji 刚好为 本函数属性三个变量对应赋值 array[i] = getNextValue(); } // 获取随机值 int suiji(void) { // 定义 int 类型函数,函数属性为无类型 return rand(); // 返回: C 标准库 – <stdio.h> rand 随机数函数 } int main(void) { int myarray[4]; // 定义数组 ,元素数量为 4 个 /* suiji 不能加括号,否则无法编译,因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/ huidiao(myarray, 4, suiji); // 调用回调函数,并且将值传给上面 huidiao 函数。属性:数组变量,长度为3位数,和随机函数数组 for(int i = 0; i < 4; i++) { printf("%d ", myarray[i]); // 读取数组角标 4 个元素 } printf("\n"); return 0; }
 0   0  32天前
admin
126
#---- 已完成验证 ----#步骤:1. 下载 mosquttio 客户端源码:https://mosquitto.org/files/source/wget https://mosquitto.org/files/source/mosquitto-1.4.14.tar.gz2. 编辑原来的   client/sub_client.c 文件为下面内容3. cmake 方式编译生成可执行文件: mkdir build && cd build && cmake .. && make  4. 执行文件 ./client/client/mosquitto_sub #include <stdio.h> #include <stdlib.h> #include <mosquitto.h> #include <string.h> #define HOST "73e.top" #define PORT 1883 #define KEEP_ALIVE 60 //心跳 60 #define named "eisc" #define passwdd "000000" #define zhutipub "v1/devices/me/attributes/request/1" #define zhutisub "v1/devices/me/attributes/request/1" #define inputpub "{"key":"name,id,status"}" bool session = true; void mqtt_subscribe_callback(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos) { int i; printf("subscribed (mid: %d): %d", mid, granted_qos[0]); for(i=1; i < qos_count; i++){ printf(", %d", granted_qos[i]); } printf("\n"); } //消息回调函数,收到订阅的消息后调用 void mqtt_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) { if (message->payloadlen){ printf("%s %s \n", message->topic, (char *)message->payload); }else{ printf("%s (null)\n",message->topic); } } //mqtt连接回调 void mqtt_connect_callback(struct mosquitto *mosq, void *userdata, int result) { int ret; if (!result){ //-------------------- 订阅多主题 ---------------# ret = mosquitto_subscribe(mosq, NULL, zhutisub, 2); ret = mosquitto_subscribe(mosq, NULL, "eisc", 2); if(ret < 0){ printf("Subscription failed\n"); }else{ printf("Subscription succeeded\n"); } }else{ printf("connect failed\n"); } } //日志回调函数 void mqtt_log_callback(struct mosquitto *mosq, void *userdata, int level, const char *str) { printf("log__ %s\n", str); } int main(void) { int err = 0; printf("mqtt client init...\n"); struct mosquitto *mosq = NULL; //libmosquitto 库初始化 err = mosquitto_lib_init(); if (err < 0){ printf("mosquitto lib int fail..."); goto fail_mosquitto_lib; } //---------------- 使用用户名 和 密码 --------------# //创建mosquitto客户端 mosq = mosquitto_new("eisc",session,NULL); // 客户端id 连接名字 // clean_session:设置为 true 可指示代理在断开连接时清除所有消息和订阅,设置为 false 以指示代理保留它们 // 用户指针用户指针 if (mosq == NULL){ printf("create client failed...\n"); err = -1; goto fail_mosquitto_new; } //设置回调函数 mosquitto_log_callback_set(mosq, mqtt_log_callback); mosquitto_connect_callback_set(mosq, mqtt_connect_callback); mosquitto_message_callback_set(mosq, mqtt_message_callback); mosquitto_subscribe_callback_set(mosq, mqtt_subscribe_callback); // 设置用户密码: mosquitto_username_pw_set(mosq, named, passwdd); //客户端连接服务器: 有效 实例 服务器ip 服务器端口 保持连接时间心跳 err = mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE); if (err < 0){ printf("connect fail"); goto fail_mosq_conn; } //主线成将被阻塞至此 err = mosquitto_loop_forever(mosq, -1, 1); if (err < 0){ printf("mosquitto loop fail"); goto fail_mosq_loop_stop; } sleep(10); // mosquitto_publish(mosq, NULL, "v1/devices/me/attributes/request/1", strlen(buff)+1, buff, 0, 0); // 发布消息函数说明:1结构体指针 2指向int指针 3发布字符串topic 4有效负载大小 5指向发送数据的指针 6 mosquitto_disconnect(mosq); mosquitto_loop_stop(mosq, false); mosquitto_destroy(mosq); mosquitto_lib_cleanup(); return 0; fail_mosq_loop_stop: mosquitto_disconnect(mosq); fail_mosq_conn: mosquitto_destroy(mosq); fail_mosquitto_new: mosquitto_lib_cleanup(); fail_mosquitto_lib: return err; }由: // 参考地址:https://www.shuzhiduo.com/A/lk5a8qANJ1/ 改编
 14   0  36天前
admin
133
sudo apt install  cmake gcc -y # ubuntu 安装 cmake 和 c 语言环境:cmake 遇到问题:Could NOT find OpenSSL缺少ssl库解决方法:sudo apt-get install libssl-dev
 0   0  36天前
admin
104
#!/bin/bash # mosquitot.sh # 搭建 emqx mqtt 服务器和 配置 上报多主题 # 客户端下载:https://mosquitto.org/files/source/ wget https://mosquitto.org/files/source/mosquitto-1.4.14.tar.gz tar -xzvf mosquitto-1.4.14.tar.gz cd mosquitto-1.4.14 ; mkdir build ; cd build && cmake .. && make ; cd client mosquitto_sub -h 73e.top -t "eisc/a" -u eisc -P 000000 -i "client1" # 订阅主题(终端) mosquitto_pub -h 73e.top -t "eisc/a" -u eisc -P 000000 -m "Hello MQTT from mosquitto-clients" # 发布主题 # 填写主题:Topic: eisc/a ########################### docker 方式配置 mqtt ############################ # 参考:https://docs.emqx.com/zh/enterprise/v4.4/getting-started/install-ee.html # 用户指南:https://docs.emqx.com/zh/enterprise/v4.4/advanced/auth.html # 博客园:https://www.cnblogs.com/fw-qql/p/10527397.html # 本地搭建访问地址:http://73e.top:18083/ docker pull emqx/emqx-ee:4.4.4 docker run -dit --name emqx-ee -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx-ee:4.4.4 docker exec -it emqx-ee bash #-------- web login user configs --------# /opt/emqx/bin/emqx_ctl admins add eisc public test # 创建用户 eisc 备注为 test /opt/emqx/bin/emqx_ctl admins passwd eisc 000000 # 重置eisc 的密码 /opt/emqx/bin/emqx_ctl admins del eisc # 删除用户 # Alpine Linux 安装软件 vi /etc/apk/repositories # 修改为国内软件源 https://mirrors.aliyun.com/alpine/v3.6/main/ https://mirrors.aliyun.com/alpine/v3.6/community/ apk update # 更新 apk add mosquitto-clients # 安装软件,卸载软件:apk del xxx 查询软件: apk search xxx emqx_ctl subscriptions list # 列出所有订阅 #----------------------------- 新增用户与主题发送和接收 -------------------------------# sed -i "156 s/allow_anonymous.*/allow_anonymous=false/g" /opt/emqx/etc/emqx.conf # 关闭匿名登陆 echo " auth.user.1.username=eisc auth.user.1.password=000000 auth.user.2.username=kun auth.user.2.password=000000 " >> /opt/emqx/etc/plugins/emqx_auth_mnesia.conf # 配置用户和密码 emqx_ctl plugins list | grep emqx_auth_mnesia # 列出所有插件,并且过滤用户模块 emqx_ctl plugins load emqx_auth_mnesia # 加载启用插件 emqx_ctl plugins unload emqx_auth_mnesia # 卸载停止插件 emqx_ctl plugins reload emqx_auth_mnesia # 重载插件 emqx_ctl status # 查看运行状态 emqx start # 启动服务 emqx stop # 停止服务 emqx_ctl clients list # 列出客户端连接 #---- username 用户名 peername 客户端 IP 与端口 clean_start MQTT Clean Start keepalive MQTT KeepAlive session_expiry_interval 会话过期间隔 subscriptions 当前订阅数量 inflight 当前正在下发的 QoS 1 和 QoS 2 的消息总数 awaiting_rel 等待客户端发送 PUBREL 的 QoS2 消息数 delivered_msgs EMQX 向此客户端转发的消息数量 (包含重传) enqueued_msgs 消息队列当前长度 dropped_msgs 消息队列达到最大长度后丢弃的消息数量 connected 是否在线 created_at 会话创建时间戳 connected_at 客户端连接时间戳 disconnected_at 客户端断开连接时间戳(仅当断开连接还保留会话时才会出现) #------ emqx_ctl clients kick "clientid" # 剔除指定客户端 emqx_ctl routes list # 列出所有陆游 emqx_ctl subscriptions add 'mosqsub/90475-airlee.lo' '/world' 1 # 手动添加订阅关系 #--------------------------- 其他储备 -----------------------------# ############################ 搭建 mqtt mosquitto 服务 ############################# sudo apt-get install mosquitto # 安装 sudo apt-get install mosquitto-clients # 安装客户端 #------------------------------------------ nano /etc/mosquitto/mosquitto.conf # 写文件 pid_file /var/run/mosquitto.pid # 这一行以软件本身为准,不要轻易修改 # 消息持久存储 persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d # 子配置 # 禁止匿名访问 # allow_anonymous false # 权限配置 acl_file /etc/mosquitto/aclfile #----------------------- 结束--------------------------- touch /etc/mosquitto/pwfile # 创建认证规则文件 #--------------------- 写文件 -------------------- sudo nano /etc/mosquitto/aclfile # 编辑配置文件限制用户 # 李雷只能发布以test为前缀的主题,订阅以$SYS开头的主题即系统主题 user lilei topic write test/# topic read $SYS/# # 韩梅梅只能订阅以test为前缀的主题 user hanmeimei topic read test/# # eisc 可以发布和订阅主题 user eisc topic write test/# topic read test/# #---------------------- 结束 --------------------- sudo vi /etc/mosquitto/conf.d/myconfig.conf # 子配置文件配置 #添加监听端口(很重要,否则只能本机访问) listener 1883 #------------------------------------------- # 关闭匿名访问,客户端必须使用用户名 allow_anonymous false #指定 用户名-密码 文件 password_file /etc/mosquitto/pwfile.txt #-------------------------------------------- sudo mosquitto_passwd -c /etc/mosquitto/pwfile.txt lilei sudo mosquitto_passwd -c /etc/mosquitto/pwfile.txt hanmeimei sudo mosquitto_passwd -c /etc/mosquitto/pwfile.txt eisc # 生成账户 lilei 和密码到指定文件 sudo systemctl restart mosquitto.service # 重新启动服务 sudo systemctl status mosquitto.service # 查看状态
 1   1  39天前
admin
128
#------ 服务器端 ------##!/bin/bash# nfs 文件储存sudo systemctl stop ufw && sudo systemctl disable ufw# 关闭防火墙sudo apt install nfs-kernel-server# 安装文件储存mkdir /nfsdata && sudo chmod 777 -R /nfsdata/*# 创建共享文件夹,并附加权限sudo nano /etc/exports# /nfsdata 192.168.4.1/24(rw,sync,no_root_squash,no_subtree_check)/nfsdata 192.168.122.1/24(rw,sync,no_root_squash,no_subtree_check)sudo systemctl restart nfs-server# 重启挂载sudo exportfs -arv && showmount -e# 服务器查看共享挂载点showmount -e 192.168.122.80# 客户端查看服务器提供的服务#------------ linux 客户端 -----------#sudo apt install  -y nfs-commonsudo mount -t nfs 192.168.122.80:/nfsdata /nfs#---------- windos 客户端 --------#服务器管理---> 添加角色 ---> 安装nfs 客户端我的电脑----> 在空白处右键,添加一个网络位置:\\192.168.122.80\nfsdata#----- /etc/fstab 开机挂载 --------#vi /etc/fstab192.168.122.80:/nfsdata /rv1126data/          nfs4   defaults 0 0# 配置端口:https://blog.csdn.net/bryanwang_3099/article/details/114702374
 0   0  39天前
admin
121
#include <stdlib.h> #include <stdio.h> //----------- 数组接收元素 ----------- int shuzu(){ int sz[31]; // 实际有 31 个元素 for(int i=0; i<=30; i=i+5){ int number= rand() %6+1; // 定义变量值为 rand 随机数:范围:从1 到 6 ,但不包含 7=6+1 。循环 的步长为 5 sz[i] = number; // 接收数组元素 printf(" %d\n", sz[i]); } printf("数组第 1 个元素是: %d\n; 数组sz 的元素个数为:\n \n ", sz[0]); return 0; } //--------------- 函数调用传值 ------------------ int czjs(void){ int a=10000; for(int b=30; b<=40; b++){ zz(a,b); // 函数调用并传值给它,让函数自己运算 } } int zz(int a, int b){ // 定义函数方法,调用我需要传值 a 和 b int c=(a + b) * a; printf("c 的值: %d\n",c ); return 0; } // ---------------- 判断中的多重匹配 switch --------------------# /* 定义函数,变量为int 类型 year month ex scanf 键盘交互, if 判断 月 小于1 或者 大于12 则满足条件输入有误 % 除以 4 余数为0 switch 对变量 month 进行 case 多重匹配 */ #include<stdio.h> int switchif() { int year, month, ex; printf("请输入年份及月份(空格分隔):"); scanf("%d %d", &year, &month); if(month < 1 || month > 12) { printf("输入有误!!"); } else { if((year%4 == 0 && year%100 != 0) || year%400 == 0) { ex = 1; printf("%d年为闰年。\n", year); } else { ex = 0; printf("%d年不为闰年。\n", year); } switch(month) { case 4: case 6: case 9: case 11: printf("%d月有%d天。", month, 30); break; case 2: printf("%d月有%d天。", month, 27+ex); break; default: printf("%d月有%d天。", month, 31); } } } //------------------ 指针 与回调函数 ---------------------- /* 1. 定义 huidiao 回调函数:指针变量 *a *c , 和其他类型 size_t ; 定义循环 初始为0,小于main 传来的 10 2. 数组 定义数组 a 由于循环打印赋值,c 为一个 sjs 随机数函 范围 1111到 1111+6666之间的范围。 c 赋值为函数。 3. main 函数 先从 回调函数传值定义规则,得到数组的元素值。然后for 循环打印数组元素 */ void huidiao(int *a, size_t b, int (*c)(void)){ for ( size_t i=0; i<b; i++ ) a[i] = c(); } int sjs(void){ return rand() %6666+1111; } int main(viod){ int mya[10]; huidiao(mya, 10, sjs); // 得到数组的元素值 for(int i=0; i<10; i++){ printf(" %d\n", mya[i] ); } printf("\n 指针回调结束。执行之前的函数 \n" ); shuzu(); czjs(); switchif(); return 0; }
 1   0  40天前
admin
716
#!/bin/bashread -p "套餐一:写字+看书套餐二:玩游戏+写程序代码强哥请选择您的套餐:" taocan a1="套餐一:写字+看书"b1="套餐二:玩游戏+写程序代码"site=$taocan # 给变量赋值case "$site" in # case  [ke?s] 情况;处理变量 $site in 是下面的值   "1") echo "===========================您选择了:$a1" # 值为r 就打印字符串   ;; # 字句结束,往下匹配   "2") echo "===========================您选择了:$b1"   ;;   *) echo "===========================输入错误请重新输入!"   ;;esac
 42   0  816天前
admin
768
 expect  [ɪkˈspɛkt] 预期;自动化插件与linux交互命令 spawn启动指定进程---expect获取指定关键字---send向指定程序发送指定字符---执行完成退出.1.   expect 常用命令spawn                交互程序开始后面跟命令或者指定程序expect              获取匹配信息匹配成功则执行expect后面的程序动作send exp_send        用于发送指定的字符串信息exp_continue        在expect中多次匹配就需要用到send_user            用来打印输出 相当于shell中的echoexit                退出expect脚本eof                  expect执行结束 退出set                  定义变量puts                输出变量set timeout          设置超时时间interact      允许用户交互2.   ssh登录远程主机并且执行命令#!/bin/bashyum install -y expect                # 安装交互工具包set timeout 30                # 设置匹配字符的等待时间/usr/bin/expect << EOF                # 执行交互程序,通过EOF 打包给程序spawn ssh root@eisc.cn                # 进行远程连接服务器expect "password:"                # 匹配密码提示send "000000\r"                # 输入密码并换行expect "#"                # 登录成功后匹配符号 #send "echo '登录成功' \r"                # 执行打印命令并换行expect eof                # 匹配结束# exit                # 退出EOF                # 总打包结束3.   ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行#!/bin/bashpasswd='tytyt123456' # 定义一个变量为字符串 # -EOF 输入多行命令    # 调用命令的路径:/usr/bin/expect <<-EOF /usr/bin/expect <<-EOF spawn ssh saneri@192.168.56.103 df -Th # 执行两个命令 # 定义一个函数,名字为: expectexpect { "*yes/no" { send "yes\r"; exp_continue }"*password:" { send "$passwd\r" }}expect eof # 将函数名字放出来执行,并结束匹配EOF #  总结束4.   expect执行多条命令#!/usr/bin/expect -fset timeout 10spawn sudo su - root # 切换用户expect "*password*" # 匹配包含字符password后send "123456\r" # 输入123456 并 /r 确定  也可以 \n  换行确定 # 新增用户命令: useradd eiscexpect "#*"send "ls\r"send "exit\r"expect eof5.   创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。1.创建主机配置文件[root@localhost script]# cat host 192.168.1.10 root 123456192.168.1.20 root 123456192.168.1.30 root 123456[root@localhost script]# lscopykey.sh  hosts2.编写copykey.sh脚本,自动生成密钥并分发key.[root@localhost script]# vim copykey.sh#!/bin/bash# 判断id_rsa密钥文件是否存在if [ ! -f ~/.ssh/id_rsa ];then ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsaelse echo "id_rsa has created ..."fi#分发到各个节点,这里分发到host文件中的主机中.while read line  do    user=`echo $line | cut -d " " -f 2`    ip=`echo $line | cut -d " " -f 1`    passwd=`echo $line | cut -d " " -f 3`        expect <<EOF      set timeout 10      spawn ssh-copy-id $user@$ip      expect {        "yes/no" { send "yes\n";exp_continue }        "password" { send "$passwd\n" }      }     expect "password" { send "$passwd\n" }EOF  done <  hosts6.    shell调用expect执行多行命令.#!/bin/bash ip=eisc.cnuser=rootpassword=www.eisc.cnexpect <<EOF      set timeout 10     spawn ssh $user@$ip     expect {  # 多个匹配用大括号来省略单词expect        "yes/no" { send "yes\n";exp_continue }         "password" { send "$password\n" }    }     expect "]#" { send "useradd hehe\n" }  # 匹配符号   ]#    为登陆后的界面    expect "]#" { send "touch /tmp/test.txt\n" }     expect "]#" { send "exit\n" } expect eof  EOF   #./ssh5.sh 192.168.1.10 root 123456
 0   0  800天前
admin
305
建议使用自带编辑工具 :gedit git.txt  & 符号: &  是后台运行sudo apt-get update sudo apt install gedit-gmate sudo apt install gedit-plugins sudo apt-get remove gedit sudo apt install gedit不建议使用 subl  ,会自动执行 shell 脚本。# 选择使用的通道:echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list# Stableecho "deb https://download.sublimetext.com/ apt/dev/" | sudo tee /etc/apt/sources.list.d/sublime-text.list# Dev sudo apt-get update# 更新提示:由于没有公钥,无法验证下列签名: NO_PUBKEY F57D4F59BD3DF454sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com  F75D4F59BD3DF454# 添加公钥 sudo apt-get install sublime-text# 更新apt源 和 安装文本编辑工具#------------- 安装方案2 --------------------#ubuntu 文本编辑工具  Sublime Text 下载地址  deb :  https://www.sublimetext.com/3    https://download.sublimetext.com/sublime-text_build-3211_amd64.deb dpkg -i sublime-text_build-3211_amd64.deb# 安装subl  1.txt# 使用方法: 自动弹出编辑框
 23   0  123天前
admin
294
#!/bin/bashapt install ntfs-3g -y                         # ubuntu/debian 安装 ntfs 分区挂载工具yum install -y ntfs-3g                       # centos 安装 ntfs 工具    mkdir -p /myfolder#  创建挂载目录    mount -t ntfs-3g /dev/sda1 /myfolder# 将 磁盘:/dev/sda1    挂载 到目标据经:/myfolderfor((i=1; i<=6; i++))  do    mkdir -p /myfolder/disk/$i#  创建挂载目录    mount -t ntfs-3g /dev/sda$i /myfolder/disk/$i # 将 磁盘:/dev/sda1    其中$i 是数数,有6分区,顺序挂载 到目标据经:/myfolder/disk/1   done
 3   0  115天前
admin
306
#---------- 安装桌面和远程桌面 ------#apt-get install xrdp  ubuntu-desktop# xrdp 是 windos 远程ubuntusudo apt install -y openssh-server# ssh登录#------ 中文输入法 -------#sudo apt install fcitx-binsudo apt-get install fcitx-table#  fcitx 框架可能对其他部署环境有冲突,可以不安装,选择ubuntu 自带的Chinese(ping yin)# 安装Fcitx输入框架,相关的依赖库和框架都会自动安装上下载搜狗输入法intel cpu选择x86:https://pinyin.sogou.com/linux/?r=pinyinsudo dpkg -i sougou.deb设置为中文:ubuntu 右上角 电源右边的 三角形图标 【设置/settings】 ---> Region & Languge ---> input source ---> 点击 + 号 ---> 点击 Chinese ---> Chinese (intelligent Pinyin)# --------- 安装中文语言 ----------#设置为中文:ubuntu 右上角 电源右边的 三角形图标 【设置/settings】 ---> Region & Languge ---> Manage installed Languwges ---> 点击进入:第一个方框:运用到整个系统第二个方框:勾选需要安装的语言,没有勾选的会被删除第三方方框:键盘输入系统:选择 Ibus如果输入法无法正常切换: apt remove -y ubuntu-desktop && apt install -y ubuntu-desktop# 使用root 用户重新安装桌面
 0   1  207天前
admin
318
   find . -type f -name "*" | xargs grep "1" -name 支持 通配符, 我的目录下只有三个文件, 所以也可以不带
 0   0  118天前
admin
321
l #  安装c 语言环境sudo apt-get install g++             # 安装C语言环境 ,或者 #  apt install -y gcc-arm-linux-gnueabihf gcc gcc-aarch64-linux-gnu mtools lib32gcc-7-dev g++-7 libstdc++-7-devgcc -v                                           # 验证安装的 C 语言是否成功vi eisc.c                                         # 编写C语言程序#include<stdio.h>int main(){    int num;     printf("输入一个数字 : ");    scanf("%d",&num);     (num%2==0)?printf("偶数"):printf("奇数");}gcc eisc.c  -o eisc.o                                     # 编译C语言为输出后的 eisc.o 文件./eisc.o                                                         # 执行编译后的C语言 C 语言基础:http://c.biancheng.net/c/
 7   0  123天前
admin
344
l #    ubuntu 安装 kvmsudo apt-get update# 更新yum sudo apt-get upgrade# 更新内核软件# ubuntu清华 apt 源:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/rebootsudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager -y# 以普通用户安装kvmsudo systemctl is-active libvirtd# 验证echo "eisc ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack   # 切换到root用户 授予eisc用户sudo超级权限。如果是其他用户,可以将eisc改为实际用户sudo usermod -aG libvirt $USERsudo usermod -aG kvm $USER# $USER 当前用户名,加入组,能够创建和管理虚拟机,否则无权限。然后注销重新登陆#--------- 网络设置 -----------#brctl show                                          # 列出网桥和接口,“ virbr0”网桥未添加任何物理接口。“ virbr0-nic”是虚拟设备,没有流量通过该虚拟设备。该设备的唯一目的是避免更改“ virbr0”网桥的MAC地址#---------- 安装桌面和远程桌面 ------#apt-get install xrdp  ubuntu-desktopapt-get install dconf-editorsudo apt install -y openssh-server# ssh登录 #    相关说明qemu-kvm -为KVM管理程序提供硬件仿真的软件。libvirt-daemon-system -用于将libvirt守护程序作为系统服务运行的配置文件。libvirt-clients -用于管理虚拟化平台的软件。bridge-utils -一组用于配置以太网桥的命令行工具。virtinst -一组用于创建虚拟机的命令行工具。virt-manager -易于使用的GUI界面和支持命令行工具,用于通过libvirt管理虚拟
 5   0  127天前
admin
442
1.  ubuntu 配置静态 ip ;   2. 修改为 动态ip  ;  3. ubuntu20 阿里云 apt 源 ;  4. ubuntu20 清华 apt 源。 apt update 与 apt upgrade 区别:只查看更新,和 更新软件包    #    修改为静态指定ipip a                           # 通过ip a 查看网卡名字,然后再下面配置中将 eth0 改为正确的网卡名nano /etc/netplan/01-network-manager-all.yamlnetwork:  ethernets:    eth0:        addresses: [10.111.111.200/24]        dhcp4: no        optional: true        gateway4: 10.111.111.1        nameservers:           addresses: [10.111.111.1,223.5.5.5]  version: 2      renderer: NetworkManager  # renderer 可不加,部分服务器加上这个参数网卡无法启动  # 223.5.5.5  网络速度慢只有1M/s 速度,建议dns 修改为网关一个ipsudo netplan apply                       # 生效配置 #    修改动态获取ipvi /etc/netplan/01-network-manager-all.yaml network:  ethernets:    eth0:      dhcp4: true  version: 2sudo netplan apply                       # 生效配置 #    ubuntu20 阿里云 apt 源阿里云源 选择系统版本, 镜像仓库:https://developer.aliyun.com/mirror/vi /etc/apt/sources.listdeb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse #    ubuntu20 清华 apt 源清华apt 源选择版本:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/vi /etc/apt/sources.list# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse# 预发布软件源,不建议启用# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverseapt update        # 命令更新软件源(只检查不更新)apt upgrade      # 更新已安装的软件包
 0   0  127天前
admin
341
debian 安装docker   网段 仓库地址, 拉取 nacos #    安装dockerapt updateapt install ca-certificates curl software-properties-common gnupg2 curl -y# 安装docker 依赖echo "deb [arch=amd64] http://mirrors.ustc.edu.cn/docker-ce/linux/debian buster stable" >> /etc/apt/sources.list#  docker 的源 ,不能有空格curl -fsSL http://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | apt-key add -# 添加gpg密匙apt-get install docker-ce# 安装dockersystemctl start docker# 启动docker#-------- docker 修改网段 -----#echo "{"registry-mirrors": ["https://hub-mirror.c.163.com"],"bip": "111.111.111.1/24"}" >  /etc/docker/daemon.jsonsystemctl daemon-reload ; systemctl restart docker      # 重启docker# bip 指定网段为:网段掩码位,如 24 错误将会导致docker无法重启  #    拉取,并配置nacosdocker拉取nacos镜像 docker search nacos                               # 搜索nacos源docker pull nacos/nacos-server            # 拉取nacos镜像mkdir -p /mydata/nacos/logs/# 新建logs目录mkdir -p /mydata/nacos/init.d/docker run --name nacos -p 8848:8848 \--privileged=true \--restart=always \-e JVM_XMS=256m \-e JVM_XMX=256m \-e MODE=standalone \-e PREFER_HOST_MODE=hostname \-v /mydata/nacos/logs:/home/nacos/logs \-d nacos/nacos-serverdebian安装docker:https://www.cnblogs.com/surplus/p/11367556.htmldocker 拉取nacos:https://www.cnblogs.com/leasing/p/15410095.html安装 nacos 集群:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.htmlnacos 集群配置:https://blog.51cto.com/u_10950710/3157514nacos 默认登录信息:http://tx.kbash.cn:8848/nacos/#/login账户/密码:nacos/nacos# nacos 的数据库是集成的,不需要改数据库
 0   0  154天前
admin
409
date +%Y-%m-%d-%H:%M:%S                      # 获取当前年月日时分秒date -d "-1 day"  +%Y-%m-%d                       # 获取时间并再当前时间减去一天,格式化时间为 年月日date -d '2 days ago'                                         # 显示2天前的时间date -d '3 month 1 day'                                  # 显示3月零1天以后的时间date -d '25 Dec' +%j                                       # 显示12月25日在当年的哪一天date -d '30 second ago'                                  # 显示30秒前的时间date -d "-3 month"                                        # 前三个月date -d "+3 year"                                           # 三年后date -d `date +%y%m01`                               # 本月第一天#--------------------- 其他说明 -----------------------#%%  一个文字的 %  %a  当前locale 的星期名缩写(例如: 日,代表星期日)  %A  当前locale 的星期名全称 (如:星期日)  %b  当前locale 的月名缩写 (如:一,代表一月)  %B  当前locale 的月名全称 (如:一月)  %c  当前locale 的日期和时间 (如:2005年3月3日 星期四 23:05:25)  %C  世纪;比如 %Y,通常为省略当前年份的后两位数字(例如:20)  %d  按月计的日期(例如:01)  %D  按月计的日期;等于%m/%d/%y  %e  按月计的日期,添加空格,等于%_d  %F  完整日期格式,等价于 %Y-%m-%d  %g  ISO-8601 格式年份的最后两位 (参见%G)  %G  ISO-8601 格式年份 (参见%V),一般只和 %V 结合使用  %h  等于%b  %H  小时(00-23)  %I  小时(00-12)  %j  按年计的日期(001-366)  %k   hour, space padded ( 0..23); same as %_H  %l   hour, space padded ( 1..12); same as %_I  %m   month (01..12)  %M   minute (00..59)  %n  换行  %N  纳秒(000000000-999999999)  %p  当前locale 下的"上午"或者"下午",未知时输出为空  %P  与%p 类似,但是输出小写字母  %r  当前locale 下的 12 小时时钟时间 (如:11:11:04 下午)  %R  24 小时时间的时和分,等价于 %H:%M  %s  自UTC 时间 1970-01-01 00:00:00 以来所经过的秒数  %S  秒(00-60)  %t  输出制表符 Tab  %T  时间,等于%H:%M:%S  %u  星期,1 代表星期一  %U  一年中的第几周,以周日为每星期第一天(00-53)  %V  ISO-8601 格式规范下的一年中第几周,以周一为每星期第一天(01-53)  %w  一星期中的第几日(0-6),0 代表周一  %W  一年中的第几周,以周一为每星期第一天(00-53)  %x  当前locale 下的日期描述 (如:12/31/99)  %X  当前locale 下的时间描述 (如:23:13:48)  %y  年份最后两位数位 (00-99)  %Y  年份  %z +hhmm        数字时区(例如,-0400)  %:z +hh:mm      数字时区(例如,-04:00)  %::z +hh:mm:ss  数字时区(例如,-04:00:00)  %:::z           数字时区带有必要的精度 (例如,-04,+05:30)  %Z          按字母表排序的时区缩写 (例如,EDT)
 0   0  144天前
admin
377
 #    系统服务[root@wwweisccn ~]# cat /usr/lib/systemd/system/eisc-logdata.service[Unit]# 服务描述Description=eisc logdate# 在网络初始化之后启动After=network.target[Service]# 服务类型Type=forking# 类型1:oneshot:程序执行完成就自动结束了,没有后台进程,比如执行一个shell# 类型2:forking:需要一个后台守护进程一直在运行,比如运行nginx、apache、sshd# https://blog.csdn.net/seaship/article/details/108235858# 守护进程:http://www.gosanye.com/post/3755.html# 进程退出立即重启Restart=alwaysRestartSec=5# 服务每5秒重新启动一次StartLimitInterval=0# 工作目录WoringDirectory=/root/eisc# 启动命令ExecStart=/root/eisc/date.sh[Install]# 当系统以多用户方式启动时,这个服务需要被自动运行WantedBy=multi-user.target #  小绿叶技术博客 安防系统 cat /usr/lib/systemd/system/eisc-anfang.service[Unit]# 服务描述Description=eisc anfang# 在网络初始化之后启动#After=network.target remote-fs.target nss-lookup.targetAfter=auditd.service systemd-user-sessions.service time-sync.target[Service]#Type=forking# 保留一个守护进程,持续运行,会报错,不加这个参数。#PrivateTmp=true# 工作目录WoringDirectory=/eisc/anfang# 启动命令ExecStart=/eisc/anfang/ip.shRestartSec=30s# 重启服务, 无效,# 需要在脚本里面自己加 无限循环,保持运行生命[Install]# 当系统以多用户方式启动时,这个服务需要被自动运行WantedBy=multi-user.target # 其他说明systemctl start eisc-logdata.service                                 # 启动服务systemctl enable eisc-logdata.service                              # 加入开机启动systemctl disable eisc-logdata                                          # 取消开机启动systemctl status eisc-logdata                                           # 查看改服务的状态#--------------------------------- nginx 服务案例 --------------------------------------#[Unit]Description=The nginx HTTP and reverse proxy serverAfter=network-online.target remote-fs.target nss-lookup.targetWants=network-online.target[Service]Type=forkingPIDFile=/run/nginx.pid# Nginx will fail to start if /run/nginx.pid already exists but has the wrong# SELinux context. This might happen when running `nginx -t` from the cmdline.# https://bugzilla.redhat.com/show_bug.cgi?id=1268621ExecStartPre=/usr/bin/rm -f /run/nginx.pidExecStartPre=/usr/sbin/nginx -tExecStart=/usr/sbin/nginxExecReload=/usr/sbin/nginx -s reloadKillSignal=SIGQUITTimeoutStopSec=5KillMode=processPrivateTmp=true[Install]WantedBy=multi-user.target#-------------------------------------------------------------------------------------#开机启动服务编写进入目录  cd /etc/systemd/system/1:编写属于自己的unit文件,命令为mybash.service,整个文件如下这边以mybash开机运行为例:1.建立服务文件1、vim /lib/systemd/system/mybash.service文件内容如下:[Unit]Description=mybash#  [dɪ ˈs  k rɪ   p  ʃn]   di s k lui p xin  服务的简单描述 After=network.target# 依赖,仅当依赖的服务启动之后再启动自定义的服务单元# Documentation : 服务文档[Service]Type=forking# Type : 启动类型simple、forking、oneshot、notify、dbus# Type=forking  以 fork 方式从父进程创建子进程,创建后父进程会立即退出ExecStart=/etc/nginx start# 启动当前服务的命令ExecReload=/etc/nginx  restart# 重启当前服务的命令ExecStop=/etc/nginx  stop# 停止服务PrivateTmp=true#ExecStart                       # 启动当前服务的命令#ExecStartPre                 # 启动当前服务之前执行的命令#ExecStartPost               # 启动当前服务之后执行的命令#ExecReload                   # 重启当前服务时执行的命令#ExecStop                     # 停止当前服务时执行的命令#ExecStopPost              # 停止当其服务之后执行的命令[Install]WantedBy=multi-user.target################################# 参考资料和说明 ###################################---------- [Unit] ----------## 配置文件的第一个区块Description                        # 简短描述Documentation                 # 文档地址Requires                            # 当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败Wants                                # 与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败BindsTo                             # 与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行Before                               # 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动After                                 # 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动Conflicts                           # 这里指定的 Unit 不能与当前 Unit 同时运行Condition...                      # 当前 Unit 运行必须满足的条件,否则不会运行Assert...                            # 当前 Unit 运行必须满足的条件,否则会报启动失败[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中Alias:当前 Unit 可用于启动的别名Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。Type:定义启动时的进程行为。它有以下几种值。Type=simple:默认值,执行ExecStart指定的命令,启动主进程Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行Type=dbus:当前服务通过D-Bus启动Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行Type=idle:若有其他任务执行完毕,当前服务才会运行ExecStart:启动当前服务的命令ExecStartPre:启动当前服务之前执行的命令ExecStartPost:启动当前服务之后执行的命令ExecReload:重启当前服务时执行的命令ExecStop:停止当前服务时执行的命令ExecStopPost:停止当其服务之后执行的命令RestartSec:自动重启当前服务间隔的秒数Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdogTimeoutSec:定义 Systemd 停止当前服务之前等待的秒数Environment:指定环境变量# https://www.cnblogs.com/aaronLinux/p/6861425.html
 0   0  156天前
admin
349
 java 进程运行总是中断 502  cat /etc/security/limits.d/20-nproc.conf *          soft    nproc     4096root       soft    nproc     unlimited# 查看root 用户的进程是最大,但是 * 号,所有用户的进程数 为 4096   可以修改为 60000 ,然后重启服务器
 0   0  151天前
admin
341
nginx 自动ssl证书配置 #    1. 安装ssl 证书软件yum install -y snapdapt install snapd# 1.安装snapd yum reinstall -y snapd# 重新安装 snapd,确保您的 snapd 版本是最新的systemctl enable --now snapd.socket# 安装后,需要启用管理主 snap 通信套接字的systemd单元snap install core;# 安装核心如果报错请检查第一步snap refresh core   # 刷新核心 snap install --classic certbot# 安装证书机器人# sudo apt-get remove certbot、sudo dnf remove certbot或sudo yum remove certbot。# 如果您使用apt、dnf或yum等操作系统包管理器安装了任何 Certbot 包 ,则应在安装 Certbot snap 之前将其删除,以确保在运行命令 certbot 时使用的是 snap,而不是从您的操作系统包安装经理。 ln -s /var/lib/snapd/snap /snap# 软连接(快捷方式)已经安装的软件 snap 到 要求的路径snap :经典限制要求在/snap或symlink下使用快照snap install --classic certbot# 安装证书机器人ln -s /snap/bin/certbot /usr/bin/certbot# 将证书机器人安装目录创建快捷方式到 运行目录  /usr/bin/certbot  (软连接)# 删除快捷方式,删除软连接  rm -rf /usr/bin/certbot #    2. 申请ssl 证书# certbot --nginx# 自动配置nginx ssl 证书,会修改nginx 配置文件,输入电子邮箱,后回车确认# 运行此命令以获取证书并让 Certbot 自动编辑您的 Nginx 配置以提供服务,只需一步即可打开 HTTPS 访问certbot certonly --nginx# 我们选择只获得nginx 证书,手动配置,将来源的ssl 证书删除,然后将自动下载的ssl 创建软链接(快捷方式)到原来的ssl 文件# 1: Keep the existing certificate for now# 暂时保留现有证书# 2: Renew & replace the certificate (may be subject to CA rate limits)# 更新和更换证书(可能受CA费率限制)  2# agree in order to register with the ACME server. Do you agree?# 同意在ACME服务器上注册。你同意吗?  y# Would you be willing, once your first certificate is successfully issued, toshare your email address with the Electronic Frontier Foundation,# 一旦您的第一份证书成功颁发,您是否愿意分享你的电子邮件地址与电子前沿基金会,成立Let's Encrypt项目的合作伙伴和机器人  no# Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel):# 选择以逗号和/或空格分隔的适当数字,或保留输入 空白选择显示的所有选项(输入“c”取消):# Successfully received certificate.# Certificate is saved at: /etc/letsencrypt/live/www.eisc.cn/fullchain.pem# Key is saved at:         /etc/letsencrypt/live/www.eisc.cn/privkey.pem# 证书的位置如上图,自动修改nginx 子站点的 ssl 路径,每三个月自动更新ssl # 由于是链接的国外  R3 证书颁发机构,可能存在失败的情况,需要重试 rm -rf /eisc/www/ssl/eisc/eisc.pemrm -rf /eisc/www/ssl/eisc/eisc.key# 删除原有ssl 证书文件ln -s /etc/letsencrypt/live/www.eisc.cn/fullchain.pem /eisc/www/ssl/eisc/eisc.pemln -s /etc/letsencrypt/live/www.eisc.cn/privkey.pem /eisc/www/ssl/eisc/eisc.keynginx -s reload# 重载nginx 配置文件教程来源:https://www.cnblogs.com/hushuning/p/14842251.html #    查看 nginx 配置信息server{listen 443 ssl;server_name www.eisc.cn eisc.cn;    ssl_certificate /etc/letsencrypt/live/eisc.cn/fullchain.pem; # managed by Certbot    ssl_certificate_key /etc/letsencrypt/live/eisc.cn/privkey.pem; # managed by Certbot     #ssl on;    ssl_session_timeout 5m;    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    ssl_prefer_server_ciphers on;location / {proxy_pass https://eisc.cn;index index.php index.html;#------------- 可见ip ------------#     proxy_set_header Host $host;     proxy_set_header X-Real-IP $remote_addr;     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}server{    if ($host = eisc.cn) {        return 301 https://$host$request_uri;    } # managed by Certbot    if ($host = www.eisc.cn) {        return 301 https://$host$request_uri;    } # managed by Certbotlisten 80;server_name www.eisc.cn eisc.cn;    return 404; # managed by Certbot
 0   0  156天前
admin
337
yum install nginx-mod-stream -y           # 安装动态模块ll /usr/lib64/nginx/modules                    # 查看动态模块文件vi /etc/nginx/nginx.conf                          # 设置配置文件重点:需要注释掉动态模块冲突引用:# include /usr/share/nginx/modules/*.conf;# 添加配置:nginx 主配置文件最外层添加,可以第一行顶部顶部添加load_module /usr/lib64/nginx/modules/ngx_stream_module.so;include /www/www/tcp/*.conf;# 设置动态模块的配置文件路径#------------------------- tcp 转发 ---------------------------#vi /www/www/tcp/8000.conf               # 编辑配置文件stream {   upstream bt {      server 10.111.111.2:8888;  }# 设置函数 tcp 转发名称:bt # 转发目的地端口:10.111.111.2:8888;server {    listen       8000;    server_name  eisc.cn;    proxy_pass   bt;}}# web 配置
 0   0  209天前
admin
388
 #--- 代理服务器(外层nginx) ---#nginx 子站点配置文件: /www/www/wwwconf/www.conf#分站子站转发配置,再server 板块的 location 方法里面server{listen 80;server_name work.eisc.cn;location / {     proxy_pass http://work.eisc.cn;     #--- 将ip 记录下来,传递给后端服务器 ---#     proxy_set_header Host $host;     proxy_set_header X-Real-IP $remote_addr;     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  }}nginx -s reload                          # nginx 配置生效,或者重启nginx #---  web 服务器(后端 nginx)---#nginx  主配置文件,非子站点:# 再 http 板块:案例下面位置处:        fastcgi_connect_timeout 300;        fastcgi_send_timeout 300;        fastcgi_read_timeout 300;        fastcgi_buffer_size 64k;        fastcgi_buffers 4 64k;        fastcgi_busy_buffers_size 128k;        fastcgi_temp_file_write_size 256k;        fastcgi_intercept_errors on;#--------- 配置可见ip ---------# set_real_ip_from 10.111.111.1; real_ip_header X-Forwarded-For;# 填写实际的内网请求来源 ip # 作用: 将内网ip 进行替换成客户端实际 ip#------------------------------# #---  nginx 主配置文件案例 ---#user  www www;worker_processes auto;error_log  /www/wwwlogs/nginx_error.log  crit;pid        /www/server/nginx/logs/nginx.pid;worker_rlimit_nofile 51200;events    {        use epoll;        worker_connections 51200;        multi_accept on;    }http    {        include       mime.types;                #include luawaf.conf;                include proxy.conf;        default_type  application/octet-stream;        server_names_hash_bucket_size 512;        client_header_buffer_size 32k;        large_client_header_buffers 4 32k;        client_max_body_size 50m;        sendfile   on;        tcp_nopush on;        keepalive_timeout 60;        tcp_nodelay on;        fastcgi_connect_timeout 300;        fastcgi_send_timeout 300;        fastcgi_read_timeout 300;        fastcgi_buffer_size 64k;        fastcgi_buffers 4 64k;        fastcgi_busy_buffers_size 128k;        fastcgi_temp_file_write_size 256k;        fastcgi_intercept_errors on;        #--------- 配置可见ip ---------# set_real_ip_from 10.111.111.1; real_ip_header X-Forwarded-For;#---------------  开启gzip 压缩  ---------------#        gzip on;        gzip_min_length  1k;        gzip_buffers     4 16k;        gzip_http_version 1.1;        gzip_comp_level 2;        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;        gzip_vary on;        gzip_proxied   expired no-cache no-store private auth;        gzip_disable   "MSIE [1-6]\.";        limit_conn_zone $binary_remote_addr zone=perip:10m;                limit_conn_zone $server_name zone=perserver:10m;#---------------------------------------------------#        server_tokens off;        access_log off;             # 关闭日志include /www/wwwroot/wwwconf/*.conf;}阿里云配置教程: https://help.aliyun.com/document_detail/54007.html第三方教程:https://www.cnblogs.com/wangxu01/articles/11243496.html
 0   0  215天前
admin
404
grep "Out of memory" /var/log/messages查看系统日志方法:运行egrep -i -r 'killed process' /var/log命令,结果如下:
 0   0  173天前
admin
354
#!/bin/bash# centos7 重装yumcatlogdata="/eisc/yum"mkdir -p $catlogdata ; rm -rf $catlogdata/*;     # 创建下载目录,并清空目录curldown="http://mirrors.163.com/centos/7/os/x86_64/Packages"                                                 # 定义下载连接变量rpm -aq|grep yum|xargs rpm -e --nodeps           # 卸载yumwgetrun(){curl $curldown/wget-1.14-18.el7_6.1.x86_64.rpm > wget.rpmrpm -ivh wget.rpm}; wgetrun                                       # 解决wget 问题rpmb=("python-iniparse-0.4-9.el7.noarch.rpm ""python-pycurl-7.19.0-19.el7.x86_64.rpm""python-2.7.5-89.el7.x86_64.rpm" "python-urlgrabber-3.10-10.el7.noarch.rpm""python-libs-2.7.5-89.el7.x86_64.rpm" "yum-metadata-parser-1.1.4-10.el7.x86_64.rpm" "yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm""yum-3.4.3-168.el7.centos.noarch.rpm");                                              # 定义数组变量要下载的包for i in ${rpmb[*]}    do        wget $curldown/$i -O $catlogdata/$i        echo "下载文件:$curldown/$i 到: $catlogdata/$i"    donerpm -ivh $catlogdata/yum-metadata-parser-1.1.4-10.el7.x86_64.rpmrpm -ivh $catlogdata/yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpmrpm -ivh $catlogdata/yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm $catlogdata/yum-3.4.3-168.el7.centos.noarch.rpm                                               # 两个包要一起安装相互依赖                                               # centos7 重装yum:https://www.cnblogs.com/DiZhang/p/12544744.htmlwget eisc.cn/file/shell/centos-yum.sh ; sh centos-yum.sh                                               # centos 切换yum 源                                                                                              yum install yum-utils -y                       # 解决:发现 XX 个已存在的 RPM 数据库问题 
 0   0  175天前
admin
1288
#---ssl 301 转跳 ---#    if ($server_port = 80){          rewrite ^(/2.php)$ http://www.eisc.cn$1 permanent;       }#--- 目录301 转跳 ---#设置 301 转跳, location /ccb/ {    return 301 http://work.eisc.cn;    proxy_pass http://eisc.cn/cs;    index  index.html index.htm;}# 说明:讲不带www 转到带www的,需要将不带www 的单独一个server 子站点配置转跳到 https://wwwreturn 301 https://www.eisc.cn$request_uri;# 设置 302 重定向 location /ccb/ {    rewrite /ccb/activity(.*)$ https://www.baidu.com break;    proxy_pass http://192.168.118.14/;    index  index.html index.htm;}#----------------------------   nginx 转发 反向代理 -----------------------------# # nginx 子站点tcp转发server{listen 80 ;listen 443;server_name kbash.cn www.kbash.cn;location / {     proxy_pass http://82.157.148.144:80;     index index.php index.html;  }}#------------- nginx https 转发 -------------## 注意如果需要配置ssl 需要再nginx 主配置http 模块文件加入ssl 证书配置,否则子站点无法设置ssl ,将会报错ssl_certificate    /www/www/ssl/www/eisc.pem; ssl_certificate_key    /www/www/ssl/www/eisc.key; # 需要已经存在的任意证书文件#------------- https 站点 ----------#server{listen 443 ssl;server_name eisc.cn www.eisc.cn;#----------------  ssl 证书  ----------------------ssl_certificate    /www/www/ssl/www/eisc.pem; ssl_certificate_key    /www/www/ssl/www/eisc.key;     #ssl on;    ssl_session_timeout 5m;    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    ssl_prefer_server_ciphers on;    add_header jiedian "eisc.cn-ceshi";    add_header "开发商"  "小绿叶技术博客eisc.cn";    add_header "节点"  "小绿叶总站--总部";location / {     proxy_pass http://eisc.cn;    }}#---------------------------------------------------------------------#1 nginx修改root映射修改root映射实现nginx目录访问重定向是最简单的方式, 推荐采用这一种.location  /image {    root   /folderName;}2 通过nginx rewrite内部跳转实现访问重定向nginx配置代码示例:location /image {    rewrite ^/image/(.*)$     /folderName/image/$1 last;}3 nginx设置别名alias映射实现配置示例:location  /image  {    alias  /folderName/image;  #这里写绝对路径}4 通过nginx的permanent 301绝对跳转实现配置示例:location /image {    rewrite ^/image/(.*)$   http://dashidan.com/folderName/image/$1;}5 通过判断uri实现页面跳转配置示例:if ( $request_uri ~* ^(/image)){    rewrite ^/image/(.*)$ /folderName/image/$1 last;}原文链接:https://blog.csdn.net/sinbadfreedom/article/details/79494702tcp 转发:https://www.cnblogs.com/baolin2200/p/7803511.html
 82   1  467天前
admin
3103
忘记登陆密码,重置密码,安装教程-网卡多ip配置============  centos 6 和 7重置密码 ===================  centos 6.8  =====1.开机按Esc  或者 e 按键进入启动选择,再按 e 进入选择修改,然后出现 root kernel initrd 这三行开头的选择信息2.光标指向 kernel 这一行,按 e 进入修改  将 rhgb quiet 修改添加空格和1 为 rhgb quiet 1 或者 修改为:   rhgb quiet single3.Esc 返回上一级,按 b 键启动系统系统4. 命令 passwd 进行修改密码,然后 reboot  重启=======  centos 7  ======1.重启系统进入 提示等待几秒后启动系统的这个界面,按e键修改2.进入修改面板,有几行开头为:if else fi initrd16;    有两行开头为:linux16 和 initrd16; 我们修改linux16 行中的: 删除 rhgb quiet 和后面的内容如:UTF什么的,(也有些用户没有后面的UTF) 删除之后在其后添加   rd.break enforcing=0   再然后按Ctrl 加 X   保存,就进入命令窗口3. 输入命令: mount -o remount,rw /sysroot #重新挂载系统为写入 chroot /sysroot #改变文件系统的root # 进入用户界面下修改文件 passwd # 设置密码touch /.autorelabel # 引导前重新标记所有文件exit # 退出# mount -o remount,ro / # 不需要执行:重新挂载为只读exit # 退出后会重启#-------------   中毒后无法修改密码error:  ------------#linux_pe挂载后进入系统,或者开机启动时按e修改,进入破解页面mount /dev/vda1 /mnt      # 挂载系统盘chroot /mnt                       # 进入系统passwd root                       # 修改密码,无法修改报错 errorchattr -i /etc/*shadow /etc/passwd /etc/groupchattr -a /etc/*shadow /etc/passwd /etc/group                                         # 设置权限lsattr /etc/*shadow /etc/passwd /etc/group                                            # 查看权限                                          # 权限全部显示为横杠 ------------- /etc/gshadowpasswd root                       # 再次修改---------------------------  centos 安装教程  ---------------------------centos分区方案策略:http://eisc.cn/index.php?c=read&id=153&page=1安装时磁盘:勾选 l will configure partitioning 我要自己分区,删除原有的 LVM 分区后将LVM更换为 Standard partition 标准分区,Dbne 再回来分区Accept Changes  [əkˈsept ˈtʃeɪndʒɪz] 接受更改在安装时:config 配置网卡,右上角的开关打开,配置网卡ipv4将DHCP更改为Manual(手动) add添加多个IPliunx多个ip:以配置DNS一样似:DNS1和DNS2样式;IPADDR1=IPADDR2=NETMASK1=NETMASK2=GATEWAY1=GATEWAY2=DNS1=8.8.8.8# dns 禁止出现dns0  需要大等于0,否则网卡不通================  ubuntu  ================-----------  重置密码  ---------1. 开机时:按ESC  后按键 e或者进入下面启动选项,选择removable device进入修改启动removable devices [rɪˈmuːvəbl dɪˈvaɪsɪz] 可移动设备或者Shift  按键选择第二个是高级选项:ubuntu 高级选项然后选择第三个,括号里有:recovery mode再然后按键e 进入启动编辑或者重启系统进入选择界面 ,按键 e   直接进入编辑不同机器有不同方式,可以三种都试一下2. 已经进入了修改界面之后在行:linux /boot/     行末 先删除 ro 和后面的内容 添加内容 quiet splash rw init=/bin/bash3.  Crtl + X 重启后箭头向下选择括号里有(recovery mode)为高级选项然后即可自动进入超级管理界面4. 输入passwd  更新密码出现password updates successfully即更改成功,输入shutdown 或直接重启虚拟机即可。若出现下面的问题 passwd: Authentication token manipulation error passwd: password unchanged  网上说是因为recovery mode下的根分区是以只读的方式挂载的,所以需要重新挂载,输入下面的指令即可:  #> mount -rw -o remount /到此,问题解决了,重启即可ubuntu server 16 安装教程: https://blog.csdn.net/weixin_43397326/article/details/83186427ubuntu 安装教程:https://blog.csdn.net/zhengchaooo/article/details/80145744如果无法分区:返回上一级,选择选择:    27.您的时区对吗?(Is this time zone correct?):Yes        * (卸载正在使用的分区)unmount partitions that are in use? : Yes        * (删除现有的逻辑卷数据)Remove existing logical volume data:Yes        * (用于引导分区的卷组的数量)amount of volume group to use for guided partitioning: ?--------   ubuntu vi 编辑:  -------(1)下面介绍一下几种光标的控制和移动(在一般模式下操作)k 向上移动 h 向左移动j 向下移动 l 向右移动h :左移一个字符 l :光标右移一个字符space:右移一个字符 Backspace:光标左移一个字符k:光标上移一行 j:光标下移一行Enter :光标下移一行w或W :光标右移一个字至字首b或B :光标左移一个字至字首e或E :光标右移一个字至字尾x 删除当前光标下的字符X 删除光标前面的字符dw 删除从当前光标到单词结尾的字符d^ 删除从当前光标到行首的字符d$ 删除从当前光标到行尾的字符D 删除从当前光标到行尾的字符dd 删除当前光标所在的行其它常用命令;ndw或ndW:删除光标处开始及其后的n-1个字do:删至行首d$:删至行尾ndd:删除当前行及其后n-1行x或X:删除一个字符,x删除光标后的,而X删除光标前的Ctrl+u:删除输入方式下所输入的文本配置网卡多个ip地址:在vi 模式下可以按 Delete 键,删除字符vi /etc/network/interfaces # ubuntu 16 路径# This file describes the network interfaces available on your system# and how to activate them. For more information, see interfaces(5).source /etc/network/interfaces.d/*# The loopback network interfaceauto loiface lo inet loopback# The primary network interfaceauto enp6s0f0iface enp6s0f0 inet static address 192.168.1.9 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.254 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 8.8.8.8iface enp6s0f0 inet static address 192.168.1.10iface enp6s0f0 inet static address 192.168.1.11#==========================sudo /etc/init.d/networking  restart # 重启网卡,然后ip add查看操作用户:cat /etc/group  # 列出用户cat /etc/group | grep ^e # grep 过滤选择, ^ 开头字符为e的用户sudo useradd username -m # 创建用户sudo passwd username # 设置密码su username # 切换用户ps -ef | grep eisc # 显示进程pid ,grep 过滤eisc名字的进程kill -9 eisc # 终止pid -9 参数;进程为eisc的进程。sudo userdel -r eisc # 删除用户eisccat /etc/issue # 查看版本号===========  ubuntu 18  ============vi /etc/netplan/50-cloud-init.yaml # ubuntu 18 路径enp6s0f0:            addresses:       - 9.0.0.9/24       - 10.0.0.10/24       - 11.0.0.11/24            dhcp4: false            gateway4: 1.1.1.254            nameservers:                addresses:                - 8.8.8.8                search: sudo netplan apply # 重启网卡===============  debian  ================忘记密码修改密码:1.重启进入开机选择界面,按键  e  后修改启动文件,2.将 linux /boot 开头的行的 末尾 ro quiet 及其后面的内容更改为    rw single init=/bin/bash3.命令:mount -a4.命令:passwd root 修改你为你的新密码5.重启,或关掉电源,完成-------------------安装教程:debian下载:http://mirrors.hust.edu.cn/debian-cd/9.8.0/amd64/iso-cd/安装教程:https://ywnz.com/linuxaz/2591.html启动后其中选择第二个为 install 最小安装安装load installer components from cd # 从CD加载安装组件install the base system # 安装基本系统guided use entire disk # 引导使用整个磁盘primary ˈprīm(ə)rē, # 主:主分区finish partitioning and write changes to disk # 完成分区并将更改写入磁盘write the changs to disks # 将更改写入磁盘 yes'device for boot loader installation # 用于引导加载程序安装的设备 : /dev/sda等待校验,然后就可以选择自己要安装的 ssh 包了a network mirror can be used to supplement the software that is included onthe CD-ROM # 可以使用网络镜像来补充CD-ROM附带的软件 # 选择否选择安装,按空格勾选,除了ssh 其余全部取消install the grub boot loader to the master boot record # 最后一部:将grub引导加载程序安装到主引导记录中,是,否则无法启动编辑文本使用:vimapt-get install -y vimvim /etc/network/interfaces # 配置网卡多个IPauto ens192:1 # 机器本身的是 allow-hotelug ens192,直接修改为auto # 多ip 格式:auto ens192 # ens192:1 其中 :1 表示新增ip  auto ens192:1 inet static address 43.242.34.245/24 gateway 43.242.34.254auto eno2 # 内网,直接在这个文档里编辑iface eno2 inet static address 192.168.1.4/24/etc/init.d/networking restart # 重启网卡service networking restart手动安装 ssh apt-get install openssh-clientapt-get install openssh-serverps -e |grep sshvi /etc/ssh/sshd_configPermitRootLogin  without-password #  修改前PermitRootLogin yes # 修改后 /etc/init.d/ssh restart # 重启service ssh restart---------------  esxi  -------------------esxi6.7序列号:       HV4WC-01087-1ZJ48-031XP-9A843需要关闭 ssh 与 esxi shell步骤:首页>>>F2>>>输入密码后回车>>>Troubleshooting Options>>>回车切换开启/关闭:右边状态栏查看当前状态 is只需要配置一个IPadd选择网卡新安装和重置密码,只有第六步不同ESXI root密码忘记,重置root密码    第一步、放入安装时候的光盘进行光盘引导,按回车键下一步  第二步、同意霸王条款,按F11,下一步:第三步、安装程序自动搜索安装磁盘 wKiom1aLjpaAj_aiAACJZu37C80110.png第四步、直接选择要安装的磁盘,就是早起安装的那个磁盘 第五步、安装程序会自动检测选择的硬盘上是否安装过系统,从而进行判断此次安装是升级还是安装第六步、由于之前安装过此系统,那么会有如下选项,解释分别如下:            (1)升级此系统,保留VSMF数据(包括用户信息),因此选择此选项无用            (2)安装此系统,保留VSMF数据(安装系统,清除账户信息,不会丢失数据)            (3)安装此系统,清楚所有VSMF数据(此操作会清空所有数据文件)                                                                  故而选择第二种安装方案                                                                第七步、设置新的密码第八步、设置好密码后,系统手机信息,就有进度条开始走了第九步、安装完成后,系统提示“成功”,reboot后继续安装大功告成,可以使用客户端使用新的密码进行登录了。linux修改 ssh 远程端口:https://www.eisc.cn/index.php?c=read&id=154&page=1
 1   0  1030天前
admin
1666
#!/bin/bashcentos6d(){release=`cat /etc/redhat-release  |grep release | awk -F" " '{print $3}' | awk -F"." '{print $1}'` ; echo "centos 版本为: $release "case "$release" in"6") echo " 当前匹配centos 版本为 6"repo="/etc/yum.repos.d/centos6-epel.repo"if [ ! -e $repo ]; then                 # -e 判断文件存在;参考:Shell if 条件判断文件或目录yum install -y wgetcd /etc/yum.repos.d/mkdir bakmv * bakwget work.eisc.cn/ruanjian/rpm/yumrepo/centos6-epel.repowget work.eisc.cn/ruanjian/rpm/yumrepo/centos6.repoyum clean all                           # 清除原有缓存yum makecache                      # 生成新的缓存                                                # make cache [me?k]  [ka?]  制作 缓存{ka xi}yum  list                                       # 校验yumcdelseecho "yum已经切换"fi;;*) echo "低版本未匹配到,正在匹配红帽版本配置yum !!!"redhat8d;;esac}centos7(){repo="/etc/yum.repos.d/epel-7.repo"if [ ! -e $repo ]; then                 # -e 判断文件存在;参考:Shell if 条件判断文件或目录yum install -y wgetcd /etc/yum.repos.d/mkdir bakmv * bakwget work.eisc.cn/ruanjian/rpm/yumrepo/Centos-7.repowget work.eisc.cn/ruanjian/rpm/yumrepo/epel-7.repo# wget http://mirrors.aliyun.com/repo/Centos-7.repo# wget http://mirrors.aliyun.com/repo/epel-7.repo                                                # 移动两个文件到 目录#wget http://mirrors.163.com/.help/CentOS7-Base-163.repo#sed -i  's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo# sed -i  's/$releasever/7/g' /etc/yum.repos.d/*                                                # yum源没有对应版本包匹配;修改yum为centos7yum clean all                           # 清除原有缓存yum makecache                      # 生成新的缓存                                                # make cache [me?k]  [ka?]  制作 缓存{ka xi}yum  list                                       # 校验yumcdelseecho "yum已经切换"fi}centos8(){repo="/etc/yum.repos.d/Centos-8.repo"if [ ! -e $repo ]; thencd /etc/yum.repos.d/mkdir bakmv * bakwget work.eisc.cn/ruanjian/rpm/yumrepo/centos8/centos8.repowget work.eisc.cn/ruanjian/rpm/yumrepo/centos8/epel.repoyum clean all #清理缓存yum makecache #更新源elseecho "yum已经切换"fi}redhat8d(){release=`cat /etc/redhat-release  |grep release | awk -F" " '{print $6}' | awk -F"." '{print $1}'` ; echo "redhat 版本为: $release "case "$release" in"8") echo " 当前匹配redhat 版本为 8"repo="/etc/yum.repos.d/Centos-8.repo"if [ ! -e $repo ]; thencd /etc/yum.repos.d/mkdir bakmv * bakwget https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo -O /etc/yum.repos.d/Centos-vault-8.5.2111.repowget https://mirrors.aliyun.com/repo/epel-archive-8.repo -O /etc/yum.repos.d/epel-archive-8.reposed -i 's/mirrors.cloud.aliyuncs.com/url_tmp/g'  /etc/yum.repos.d/Centos-vault-8.5.2111.repo &&  sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo && sed -i 's/url_tmp/mirrors.aliyun.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.reposed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/epel-archive-8.repoyum clean all && yum makecacheelseecho "yum已经切换"fi;;*) echo "红帽版本未匹配到,退出!!!";;esac}release=`cat /etc/redhat-release  |grep release | awk -F" " '{print $4}' | awk -F"." '{print $1}'` ; echo "centos 版本为: $release "case "$release" in"6") echo " 当前匹配centos 版本为 6"centos6;;"7") echo " 当前匹配centos 版本为 7"centos7;;"8") echo "当前匹配centos 版本为 8"centos8;;*) echo "您的centos过于老旧,正在匹配低版本"centos6d;;esac# 清华 apt 源:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/# centos 6 切换yum: https://help.aliyun.com/document_detail/193569.htm# 一键切换yum执行: wget www.eisc.cn/file/shell/centos-yum.sh ; sh centos-yum.sh# 感谢网友提供yum解决方案:https://developer.aliyun.com/article/748336# 阿里巴巴开源镜像站,镜像仓库:  https://developer.aliyun.com/mirror/# 阿里云linux系统镜像: https://mirrors.aliyun.com/centos-vault/1. /etc/yum.repos.d 文件夹里面的文件全部移动到其他目录,重新部署 yum2. 辛苦切换一下yum :https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11Pi5Ktu#---------- alibaba3 -----------#mkdir /yumbackmv /etc/yum.repos.d/* /yumbackwget work.eisc.cn/ruanjian/rpm/yumrepo/alibaba3/AliYun.repo -O /etc/yum.repos.d/al3.repowget work.eisc.cn/ruanjian/rpm/yumrepo/alibaba3/epel.repo -O /etc/yum.repos.d/epel3.repoyum clear all ; yum list#--------- centos8 停止维护,更换yum  -------------#停止维护公告:https://help.aliyun.com/noticelist/articleid/1060980265.html更换yum:https://help.aliyun.com/document_detail/405635.html迁移服务器系统:https://help.aliyun.com/document_detail/370865.htm?spm=a2c4g.11186623.0.0.58863201lhpfjW#task-2156316
 0   9  860天前
admin
806
# 301 访问2.php文件转跳到另一个网站的2.php文件, 删除$1 就不指定文件名, 如果是https 方式 就要将80改为443在nginx配置文件的 server() 板块进行添加    if ($server_port = 80){          rewrite ^(/2.php)$ http://www.eisc.cn$1 permanent;       }
 6   0  399天前
admin
713
#!/bin/bashfolder="/eisc/yum"          # 定义下载目录mkdir -p $folder            # 创建下载目录wgetfile=(https://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/Packages/python-2.6.6-66.el6_8.x86_64.rpmhttps://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpmhttps://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/Packages/python-libs-2.6.6-66.el6_8.i686.rpmhttps://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/Packages/python-pycurl-7.19.0-9.el6.x86_64.rpmhttps://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/Packages/python-urlgrabber-3.9.1-11.el6.noarch.rpmhttps://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/Packages/yum-3.2.29-81.el6.centos.noarch.rpmhttps://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/Packages/yum-metadata-parser-1.1.2-16.el6.x86_64.rpmhttps://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.30-41.el6.noarch.rpm)iffile="$folder/yum-plugin-fastestmirror-1.1.30-41.el6.noarch.rpm"                            # 定义已经存在的文件if [ ! -e $iffile ]         # 判断文件 ! 不存在,then 开始  then       for ((i=0;i<${#wgetfile[*]};i++))                         # i初始为0 数组角标从0开始                                       # i 范围为 0 到  小于数组个数值,这个区间自增加                                       # 数组 [*] 符号*指定所有,可以改为0从第一个角标,1表示第二个                                       # 不加#号表示展示数组元素          do             wget -P $folder  ${wgetfile[$i]}                                 # wget -P 文件夹   被下载的文件       done  else        echo "安装文件已经下载!"fi#------- 安装 -------#rpmfile=(`ls $folder`)for((i=0;i<${#rpmfile[*]};i++  )) dorpm -ivh --force --nodeps $folder/${rpmfile[$i]}donecentos7 下载链接:https://mirrors.aliyun.com/centos-vault/7.0.1406/os/x86_64/Packages/脚本执行:wget www.eisc.cn/file/shell/yumnocommand6.sh ; sh yumnocommand6.sh
 0   0  316天前
admin
673
#------ 301 转跳 ----## 301 访问2.php文件转跳到另一个网站的2.php文件, 删除$1 就不指定文件名,  如果是https 方式 就要将80改为443在nginx配置文件的  server()  板块进行添加    if ($server_port = 80){          rewrite ^(/2.php)$ http://www.eisc.cn$1 permanent;       }#----  nginx 转发 反向解析代理--# # nginx 子站点tcp转发server{listen 80;listen 443;server_name www.kbash.cn;location / {     proxy_pass http://47.105.46.67;     index index.php index.html;  }}nginx -s reload        # 重载nginx配置#-------------------------等待研究--------------------------------------##PROXY-START/location  ~* \.(gif|png|jpg|css|js|woff|woff2)${    proxy_pass http://eisc.cn;    proxy_set_header Host tx.kbash.cn;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    proxy_set_header REMOTE-HOST $remote_addr;    expires 12h;}location /{    proxy_pass http://eisc.cn;    proxy_set_header Host tx.kbash.cn;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    proxy_set_header REMOTE-HOST $remote_addr;        add_header X-Cache $upstream_cache_status;        #Set Nginx Cache            add_header Cache-Control no-cache;}#PROXY-END/#-------------------------------   官方案例    ---------------------------------------#worker_processes auto;error_log /var/log/nginx/error.log info;events {    worker_connections  1024;}stream {    upstream backend {        hash $remote_addr consistent;        server backend1.example.com:12345 weight=5;        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;        server unix:/tmp/backend3;    }    server {        listen 12345;        proxy_connect_timeout 1s;        proxy_timeout 3s;        proxy_pass backend;    }    server {        listen [::1]:12345;        proxy_pass unix:/tmp/stream.socket;    }}#-------------------------    已成功案例    ---------------------------------user www-data;worker_processes auto;pid /run/nginx.pid;include /etc/nginx/modules-enabled/*.conf;events {worker_connections 768;# multi_accept on;}stream{log_format proxy '$remote_addr [$time_local] ''$status "$upstream_addr"';upstream ipctcp_proxy {hash $remote_addr consistent;server eisc.cn:80 weight=5 max_fails=3 fail_timeout=30s;server eisc.cn:37 weight=5 max_fails=3 fail_timeout=30s;server eisc.cn:55 weight=5 max_fails=3 fail_timeout=30s;}server{error_log /var/log/nginx/error.log;access_log /var/log/nginx/access.log proxy;listen 80;listen 8080;listen 37;listen 55;proxy_connect_timeout 1s;proxy_timeout 3s;proxy_pass ipctcp_proxy;}}
 0   1  332天前
admin
963
1.ssh keys 自行配置,2. 集群配置ssh 密钥  3.阿里云密钥配置 #     使用密匙秘钥登录服务器chmod 600 1.pem                                # 使用密匙 1.pem 登录,需要加权限 401 读和执行,                                                            # 7=4+2+1 = r + w  + x   读+写+执行;   Read(4)  Write(2)  eXecute(1)ssh -i /root/1.pem root@10.1.1.1         # 使用密匙登录服务器 #     配置远程服务器 sshd 服务开启 密钥和密码登录  流程:再本机生成密匙---> 将本地密匙 发送给远程服务器授权  --->  本地使用这个密匙远程免密登录目的服务器1. 生成的公共密钥保存在/.ssh/id_rsa.pub  私有密钥保存在 /.ssh/id_rsa   复制   .ssh/id_rsa.pub   文本内容到目标服务器2. 目标服务器:用户家目录创建文件:.ssh/authorized_keys    3. 权限:chmod 600 .ssh/authorized_keys    # vim /etc/ssh/sshd_config                     # 修改sshd 配置文件PasswordAuthentication no                     #     [ˈpɑ ːs  wɜː d      ɔːˌ θen tɪˈ keɪ ʃn]  o fen ti k xin  密码 验证,登录  yes  或者 no                                                                  ChallengeResponseAuthentication no      # yes改为noRSAAuthentication yes                             # 去掉前面的注释PubkeyAuthentication yes                        # 去掉前面的注释AuthorizedKeysFile .ssh/authorized_keys   # 去掉前面的注释echo "RSAAuthentication yesPubkeyAuthentication yes# 开启密钥登录PermitRootLogin yes开密码登录" >> /etc/ssh/sshd_config                                               # 配置sshd 密钥和密码登录systemctl restart sshd            # 重启ssh服务chmod 700 ~/ ; chmod 700 ~/.ssh ; chmod 600 ~/.ssh/authorized_keys                                                # 文件权限,本地和服务器都需要配置#----------------------------        本地配置ssh密钥,发送到远程服务器进行免密登录         -------------------------------#echo "# 生成密匙对:请一直回车,生成默认空的密匙,也可以参考生成密匙说明"ssh-keygen -t rsa                             # 在本地生成密钥 # 生成密匙对:一直回车;其中id_rsa 是私钥,id_rsa.pub是公钥                                                        # 密钥和私钥是成对存在的,缺一不可echo "使用ssh秘钥分发 将本地密钥发送给远程服务器授权识别"ssh-copy-id -i /root/.ssh/id_rsa.pub root@43.255.28.59 # 对方主机地址IPssh root@10.111.111.80                 # 免密直接登录服务器 #    ssh keys 生成秘钥说明#------  命令生成 密匙种类 一直回车确认 ------#ssh-keygen -b 4096                          # RSA    无需 -t 指定,-b 指定安全尺寸范围: 1024~16348                                                          # 注意:使用更长的密钥存在收益递减。安全性比 RSA-2048 所提供的更强,应该做的是改用椭圆曲线密码学 ECDSAssh-keygen -t ed25519                     # [dʒen]  jie m  消息,密钥消息#----------- 案例:    ssh-keygen -t rsa      -----------#Generating public/private ed25519 key pair.                                                                           # [ˈdʒe nə reɪ tɪŋ]   jie lou rei ting 生成  [ˈpʌ b lɪk] /  [ˈp raɪ vɪt]  公共私有   [kiː]  [per]  密匙  (一),  两对Enter file in which to save the key (/root/.ssh/id_ed25519):                                              # [ˈentər]  en tou 输入 ( 开始)  文件 [faɪl]  [ɪn]  在  [wɪtʃ]   [tu ] 其中  保存这个密钥 {the 形容词翻译可以省略}                                              # 输入保存密钥的文件。自定义文件名和路径                                              # 注意:密钥文件名不能重复,否则会覆盖原来的密钥Created directory '/root/.ssh'.                                               #  [k ri ˈeɪ tɪ d]  kui ei tei te 创建  [də ˈre k tə ri]  dou ruai ke tou rui  目录Enter passphrase (empty for no passphrase):                                                # 输入 pass  [f reɪ z]  短语,密码短语   [ˈe m pti] en m d 空的  为 没有密码短语。类似于密码加密,建议输入Enter same passphrase again:                                               #  输入 [seɪ m] 相同 密码短语   [əˈ ɡen] ou gen  再一次Your identification has been saved in /root/.ssh/id_ed25519.                                                # 您的 [aɪˌ den tɪ fɪˈkeɪ ʃn]  ai den ti fei k xin 标识  [biːn] 曾经,has been 已经。保存在Your public key has been saved in /root/.ssh/id_ed25519.pub. The key fingerprint is:              #  [ði] 这个  [kiː] k i   密匙,关键,  [ˈfɪŋɡəprɪnt] shen ge p len t 指纹              SHA256:xdq0kS22xfwTBo4d3BKD7uUXxtWS/ikPQEQsH7O1lEA root@localhost.localdomainThe key's randomart image is: #    3. 阿里云密匙对配置  ECS 管理---网络与安全---密匙对---创建密匙对---查找创建的密匙对,绑定ECS实例控制台操作重启ECS生效参考:https://wangdoc.com/ssh/key.html
 0   1  498天前
admin
443
#----  方案一,通过数据库修改管理后他域名 ---#第一步、进入数据库管理,大部分都是phpmyadmin管理,不是的也没事,反正进入到数据库管理就行,找到wp_options数据库表,如下图第二步、编辑选项名称siteurl和home后面的那个地址,如下图第三步、比如我老域名是www.liuhai.net,我现在要改成新域名www.baidu.com,改好选择保存,点执行后如下图通过数据库该域名http://www.liuhai.net/1239.html#----- 其它无效方法 直接忽略----------#找到wordpress中使用的模板中的function.php文件,查找路径如:/wwwroot/wp-content/themes/模板文件/function.phphttps://jingyan.baidu.com/article/afd8f4deaaae0334e386e955.html方法二:重命名登录页找到wp-login.php 更改为自定义的文件名,为了演示的需要,笔者更改为ilovelogin.php然后把ilovelogin.php里面所有wp-login全部替换为ilovelogin然后访问:http://localhost/w/ilovelogin.php 即可访问登录找到你现在所使用的主题,在主题目录中找到functions.php,在这个文件中加入以下代码:update_option(‘siteurl’,’http://你的新域名’);update_option(‘home’,’http://你的新域名’);
 0   0  248天前
admin
563
#----- 创建专有网络和交换机 ------------##--- 已经存在ecs ---#1. 进入 ecs 服务器 控制台 --- 点击左侧 【实例】 --- 点击顶部切换 【地域】--- 点击实例id 进入ecs 服务器 --- 可以查看 cpu 内存 ip 等信息 --- 下拉 找到【网络信息】 --- 绑定辅助弹性网卡 右边的三个点展开选项 --- 管理ipv6 --- 弹窗出来ipv6 地址 --- 分配新ipv6  --- 弹窗关闭后,复制专有网络id :vpc****2. 开通ipv6 带宽: IPv6网关管理控制台 --- 顶部切换到服务器所在地域 ---- ctrl +f  与 ctrl +v 定位vpc 位置 --- 点击定位左边的 :网关 id 进入 ---- 看到 ipv6 公网带宽 --- 右边点击 : 【开通公网带宽】3. 重点:服务器内部配置 配置IPv6地址 驱动:wget https://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/ipv6/rhel/ecs-utils-ipv6?spm=a2c4g.11186623.0.0.486d6b17mxAJEC -O ipv6                                                             # centos 下载驱动:大写O 下载文件保存为 ipv6 文件名# wget https://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/ipv6/debian/ecs-utils-ipv6?spm=a2c4g.11186623.0.0.486d6b17mxAJEC -O ipv6                                                            # ubuntu/Debian: 下载这个驱动chmod +x ipv6                                     # 附加执行权限./ipv6                                                    # 执行当前目录下的这个脚本4. 添加安全组规则 ---- 进入ecs 实例 --- 切换地域 ---- 进入ecs 实例 ---- 点击安全组 ---- 如果有多个安全组 建议移除后保留一个 ---点击 【配置规则】--- 入方向手动添加 --- 协议类型 点击选择 ipv6 ---  点击端口范围选择全部  ---  授权对象 : ::/05. 测试ipv6 : ping6 aliyun.comcurl -6 aliyun.com#-----------------------------------  其他注意项 -----------------------------##---  如果没有 ecs  ----#1. 登录: 专有网络控制台2. 顶部选择 地域 --- 创建专有网络--- 名称自定义(只能大小写,不能加特殊符号如:-)3. 左侧导航栏交换机 --- 点击实例id 进入 --- 往下拉云资源管理 --- ecs 加号新增#--- 删除 vpc 专有网络 ----#先删除交换机--- 再 安全组 切换地域 找到并勾选删除 --- 最后删除vpc专有网络 专有网络控制台说明:专有网络的地域和要部署的云资源的地域必须相同,本文选择华北5(呼和浩特)。说明 目前,仅以下地域支持开通IPv6网段:华北1(青岛)、华北2(北京)、华北3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华东1(杭州)、华东2(上海)、华南1(深圳)、华南2(河源)、华南3(广州)、西南1(成都)、中国(香港)、新加坡、美国(弗吉尼亚)、德国(法兰克福)。
 0   0  241天前
admin
845
1.手动安装,2.脚本自动安装 1.手动安装yum install -y ntpdate # 安装时间工具timedatectl set-timezone Asia/Shanghai # 设置时区:亚洲/上海systemctl restart ntpdate # 重新启动ntpsystemctl enable ntpdate # 添加开机启动; system [ˈsɪstəm] 系统; enable [ɛˈnebəl] 启动;  cat /etc/redhat-release  # 查看系统版本yum install -y wget # 下载工具rpm -Uvh http://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm # -U upgrade [ʌpˈɡreɪd] 改进  # -v verbose [vəːˈbəʊs] 沉长的;provide more detailed output   [prəˈvʌɪd] [mɔr] [ˈdiːteɪld]  [ˈaʊtpʊt] 提供更详细的输出 # -h hash [haʃ] 在...什么(打撒,混杂);print hash marks as package installs  [mɑːks]标记 [ˈpakɪdʒ] [ɪnˈstɔːl]安装包 ;在软件包安装时打印散列标记wget -rndp /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # wget -O 下载文件到指定目录;此处是替换原有文件systemctl stop firewalld # 关闭防火墙 firewall  [ˈfaɪrwɑl]setenforce 0 # 临时关闭selinux;永久关闭:sed -i "s/SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config ; rebootyum -y install httpd mariadb mariadb-server php php-mysql php-bcmath php-mbstring zabbix-server-mysql zabbix-web-mysql zabbix-agent # 安装mariadb  等软件sed -i s/index.html/index.php/g /etc/httpd/conf/httpd.conf # 修改默认访问文件;  find / -name "httpd.conf" | grep "etc"  # 查找 etc目录下的这个文件 # httpd.conf 修改 index 添加运用:x-httpd-php .php  去过滤grep Add cat -n `find / -name "httpd.conf" | grep etc` | grep "AddType application"  # cat -n 查看文件显示行号;`find / -name "httpd.conf" | grep etc` 反单引号是执行结果为一个整体变量;find 查找文件路径 # grep 查找sed -i "272 a\AddType application/x-httpd-php .php" /etc/httpd/conf/httpd.conf # 添加运用的位置 ; a\ 是在指定272行下面插入字符 # 由上个查看行号有四行,任意位置可以添加,我这里是272行cat -n /etc/php.ini | grep "date.timezone" # 查看时间区域行号;我这里是878行sed -i "878 a\date.timezone = Asia/Shanghai" /etc/php.ini systemctl start mariadb # 重启mariadb数据库systemctl enable mariadb # enable [ɛˈnebəl] 启动;开机启动mysql  # 默认没有密码,直接mysql 进入数据库;设置密码后需要 mysql -uroot -p密码  进入数据库set password = password('eisccn') ;   # 设置密码create database zabbix character set utf8 collate utf8_bin; # create  [kriˈet] 创建 ;database [ˈdædəˌbeɪs] 数据库;character [ˈkɛrɪktər] 字符,设置字符类型,collate [kəˈlet] 核对字符 # 登陆数据库,创建库编码为utf8grant all on zabbix.* to 'zabbix'@'localhost' identified by '123' # grant [grænt] 授权;all 所有,on 在...上;    授予zabbix账户在 localhost [ləʊkæl'həʊst] 本机的所有权限; identified [aɪ'dentɪfaɪd] 识别(设置密码) # identified [aɪ'dentɪfaɪd] 标识;by 由 123密码:设置zabbix 的 DBPassword # 123 是密码,需要单引号,数据库账户和本机需要find / -name "create.sql.gz" # 查找数据库文件路径zcat /usr/share/doc/zabbix-server-mysql-4.4.10/create.sql.gz | mysql -uzabbix -p123 zabbix # 将查到的文件导入数据库账户 zabbix 下的库名zabbix下cat -n /etc/zabbix/zabbix_server.conf | grep DBPassword # 查看到是124行sed -i "$NRuser a\DBPassword=123" /etc/zabbix/zabbix_server.conf # 配置密码/usr/bin/systemctl restart httpd zabbix-server zabbix-agent/usr/bin/systemctl enable httpd zabbix-server zabbix-agent # enable [ɛˈnebəl] 启动; 开机启动#################################添加主机####################################rpm -Uvh http://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpmyum list # 更新yumyum -y install zabbix-agentread -p "请输入Zabbix-serve的ip地址:" server_IPsed -i s/127.0.0.1/$server_IP/g /etc/zabbix/zabbix_agentd.conf /bin/systemctl restart zabbix-agent.service网页操作:ZABBIX 顶部导航栏 ---> 配置 --- 主机群组 --- 创建主机群组 --- 定义名称:ceshi  --- 点击添加ZABBIX 顶部导航栏 ---> 配置 --- 主机 --- 创建主机 ---主机名称:zabbix_ceshi 群组: 选择刚创建的 ceshiagent代理程序的接口: 被监控的主机IP地址, 端口10050  保存ZABBIX 顶部导航栏 ---> 配置 --- 主机 --- 模版 --- 选择模板 Template OS Linux by Zabbix agent --- 更新ps aux | grep zabbix # 查看服务是否启动yum install -y telnet # 端口测试工具telnet x.x.x.x 10050 # 测试端口是否联通再到首页查看状态##########################################邮件报警ping监控###################################################systemctl stop firewalld # 关闭防火墙yum install fping -y  # 在server和proxy端均安装fpingFpingLocation=/usr/sbin/fping  # 在server和proxy端的配置文件里面打开注释telnet hc1.ssh.gs 10050 # ping 端口ZABBIX 顶部导航栏 ---> 配置 --- 主机群组 --- 点击刚刚创建的用户组里的用户zabbix_cesshi --- 监控项 --- 创建监控项名称:ping test类型:简单检查键值:icmpping[43.225.156.172,2,1000,68,3000]主机接口:默认信息类型:数字更新间隔:30s自定义时间间隔:类型:灵活    间隔:50s    期间:默认历史数据保留时长:90d储存时间 :365d查看值:不变应用集:无保存ZABBIX 顶部导航栏 ---> 配置 --- 主机群组 --- 点击刚刚创建的用户组里的用户zabbix_cesshi --- 监控项 --- 触发器 --- 创建触发器名称:fping严重性:警告表达式:选择 ping test保存ZABBIX 顶部导航栏 ---> 配置 --- 主机群组 --- 点击刚刚创建的用户组里的用户zabbix_cesshi --- 图形 --- 创建图形名称:fping监控项 --- 添加 --- ping test添加保存##########################################实现邮件报警功能 server 端口配置###################################################yum install mailx -y # 安装linux邮件工具,在控制节点:server 端进行操作; agent 是被监控端vi /etc/mail.rcset bsdcompatset sendcharsets=iso-8859-1,utf-8set from=xitong-mail@eisc.cnset smtp=smtp://smtp.exmail.qq.comset smtp-auth-user=xitong-mail@eisc.cnset smtp-auth-password=xxxxxxset smtp-auth=login # 编辑邮件登陆配置信息echo "这是一封测试邮件" | mail -s "zabbix" xxx@eisc.cn # 测试邮件发送是否正常mkdir -p /data/zabbix_server/data/alertscripts # 创建发邮件发警的脚本所在目录zabbix=`find / -name "zabbix_server.conf"` # 查找zabbix配置文件目录,将结果赋值给zabbix变量cat -n $zabbix | grep "AlertScriptsPath" # 查看需要更改的位置sed -i "517 s/AlertScriptsPath.*/AlertScriptsPath=\/data\/zabbix_server\/data\/alertscripts/g" $zabbix # 517 指定517行的内容进行修改 # sed 修改, 将AlertScriptsPath.*  后面的所有内容修改为:AlertScriptsPath=/data/zabbix_server/data/alertscripts   特殊符号 /,用转译 \systemctl restart zabbix-server.service # 重启服务 vi /data/zabbix_server/data/alertscripts/mailx.sh # 编写发邮件脚本#!/bin/bash#echo "$3" | mail -s "$2" "$1"FILE=/tmp/mailtmp${RANDOM}.txttouch $FILEecho "$3" >$FILEdos2unix -k $FILEmailx -v -s "$2" "$1" < $FILErm -rf $FILEchmod +x /data/zabbix_server/data/alertscripts/mailx.shchown zabbix:zabbix /data/zabbix_server/data/alertscripts/mailx.sh # 脚本增加执行权限sudo -u zabbix /data/zabbix_server/data/alertscripts/mailx.sh xxx@eisc.cn "zabbix alert" "/etc/passwd is changed" # 测试一封邮件# zabbix页面配置webZABBIX 顶部导航栏 ---> 管理 ---> 报警媒介类型 ---> 创建媒体类型 ---> 名称:agent 报警器类型:脚本脚本名称:mailx.sh脚本参数(增加三个):{ALERT.SENDTO}{ALERT.SUBJECT}{ALERT.MESSAGE}# 创建用户 email 导航栏 --- 管理 --- 用户 --- 右上角创建用户 --- 别名:email 选择群组: Zabbix administrators密码:aaaassss保存# 创建用户组导航栏 --- 管理 --- 用户群组 --- 右上角创建用户群组组名:emailgroup用户(点击选择):email 再点击二级栏目的权限为读写保存# 配置用户报警媒介:导航栏 --- 管理 --- 报警媒介类型 --- 创建媒体类型 --- 类型选择脚本名称:Email脚本类型:脚本脚本名称:mail.sh# 点击添加,保存# alert [əˈlərt] 报警 ;   to send   [sɛnd tu] 发送到 ;  message  [ˈmɛsɪdʒ] 消息#用户配置 ZABBIX 顶部导航栏 ---> 管理 --->  用户 ---> Admin ---> 报警媒介 ---> 添加 ---> 类型:agent 报警器接受人: xxx@eisc.cn启用时间默认如果存在严重性则使用:全选勾选已启用点击添加# 配置动作ZABBIX 顶部导航栏 ---> 配置 --->  动作 ---> 创建动作 名称: tcping新的触发条件:  主机 等于  test_centos选择后,再点击已启用上面的【添加】再点击【操作】暂停操作以制止问题操作【新的】发送到用户群组:【添加】【emailgroup】   【zabbix administrator】发送到用户: 【admin】 【email】点击蓝色【添加】上面的【添加】再点击【恢复操作】操作【新的】发送到用户群组:【添加】【emailgroup】   【zabbix administrator】发送到用户: 【admin】 【email】点击蓝色【添加】上面的【添加】再点击下已启用下面的【添加】 总添加完成ZABBIX 顶部导航栏 ---> 管理 --- 用户 --- Admin --- 报警媒介 --- 添加 : 填写收件人:xxx@eisc.cn 2.脚本安装#!/bin/bash###################check network###################echo '正在检测网络是否和zabbix官方通畅......'ping -c 2 www.zabbix.com > /dev/null # 将ping -c 2  拼两次的消息结果重定向到空洞/dev/null,清除消息记录if [ $? != 0 ];then # $? 是上一个程序执行是否成功的标志,如果执行成功则$? 为0,否则 不为0 echo "请检查网络!" exit # 运行到此情况(网络异常ping不通);就全局退出脚本 [ˈɛgzɪt] exit 出口else echo "网络正常!" # 正常情况不仅仅打印一句话,然后继续往下执行fi###################set yum#################################yum install -y ntpdate ntpdate -u cn.pool.ntp.org timedatectl set-timezone Asia/Shanghai #  systemctl start ntpd # start [stɑrt] 开始;开始执行 systemctl enable ntpd # enable [ɛˈnebəl] 启动;加入开启启动#时间矫正rm -rf /var/run/yum.pid # yum.pid 作用:防止启动多个进程副本;此处不需要yum -y install wgetsystem=`cat /etc/redhat-release | awk -F "." '{print $1}'` # release [riˈlis] 发布; system [ˈsɪstəm] 系统  # 查看系统版本,awk字段处理以点为分隔符:打印第一列;将结果赋值给变量 systemif [ "$system" == 'CentOS Linux release 7' ];then # if 判断变量 字符串绝对等于 指定字符串,then 然后执行    rpm -Uvh http://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm # U更新,升级rpm ;v表示显示安装过程,h表示显示进度    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # wget -O 下载文件到指定目录;此处是替换原有文件    systemctl stop firewalld # 关闭防火墙 firewall  [ˈfaɪrwɑl]setenforce 0 # 临时关闭selinuxsed -i "s/SELINUX\=.*/SELINUX=disabled/g" /etc/selinux/config #永久关闭selinux ; disabled [dɪˈsebəld] 废除;  config [kən'fɪg] 配置,设置elif [ "$system" == 'CentOS release 6' ];then    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo # base [bes] 基地;mirror [ˈmirəz] 镜像,镜子    rpm -Uvh http://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm    service iptables stopsetenforce 0 # 临时关闭selinuxsed -i "s/SELINUX\=.*/SELINUX=disabled/g" /etc/selinux/config #永久关闭selinux ; disabled [dɪˈsebəld] 废除;  config [kən'fɪg] 配置,设置fi##################install###############################eth=`ip a| grep "BROADCAST" | awk -F ":" 'NR==1{print $2}' | sed "s/ //g"` ; echo "网卡名为:"$eth ;                                                                                 # 命令 ip a 查看网卡 过滤;broadcast  [ˈbrɔːdkɑːst] >广播;字段的行                                                                                 # awk -F ":" 以冒号为分隔符 ; 选择第一行,第二列,sed删除空格 # 符号  ; 分号表示第一条命令结束,第二条开始ethCatalog=$(find / -name "*$eth" | grep "/etc/" | sed "s/ //g" ) ;  echo "网卡路径为: "  $ethCatalog # catalog [ˈkætəlɔg] 目录 # find 查找网卡名称的路径,grep 过滤/etc 目录下网卡名称。sed删除空格ip=$(cat $ethCatalog | grep IPADDR | awk -F "=" 'NR==1{print $2}' | sed "s/ //g") ; echo "IP地址为: " $ip                                                                                # 查看网卡文件,过滤IPADDR的行,awk -F"=" 分隔符是冒号,打印第一行第二列sleep 5 # 等待5秒钟;sleep [slip] 睡眠server(){yum -y install httpd mariadb mariadb-server php php-mysql php-bcmath php-mbstringyum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent # 安装mariadb  等软件sed -i s/index.html/index.php/g /etc/httpd/conf/httpd.conf # 修改默认访问文件#######################修改配置文件################### sed -i "N;286i\AddType application/x-httpd-php .php" /etc/httpd/conf/httpd.conf# sed -i "N;880i\date.timezone = Asia/Shanghai" /etc/php.iniNRhttpd=$(cat -n /etc/httpd/conf/httpd.conf | grep "AddType application/x-gzip .gz .tgz" | awk -F" " '{print $1}' | sed "s/ //g") # add type  [æd] [taɪp] 添加类型; application [ˌæpləˈkeʃən] 运用; # cat -n 查看文件内容并显示行号 # grep 匹配字符串所在行的整行内容 # awk -F" " 字段处理指定分隔符为空格,打印第一列;删除空格echo "根据字符串查找的文本中的行号:"$NRsed -i "/AddType application\/x-httpd-php .php/d" /etc/httpd/conf/httpd.conf # 在写入前,先删除将要插入的字符串,保证不会重复插入sed -i "$NRhttpd a\AddType application/x-httpd-php .php" /etc/httpd/conf/httpd.conf # $NR a\  根据查找到行号,的下一行插入字符串 # i\  是上一行插入字符串NRdate=`cat -n /etc/php.ini | grep ";date.timezone =" | awk -F" " '{print $1}' | sed "s/ //g"` ; echo $NRdatesed -i "/Asia\/Shanghai/d" /etc/php.inised -i "$NRdate a\date.timezone = Asia/Shanghai" /etc/php.ini  # 其中符号 ;  表示注释符号。####################################################/usr/bin/systemctl start mariadb # 重启mariadb数据库/usr/bin/systemctl enable mariadb # enable [ɛˈnebəl] 启动;开机启动mysql -e "set password = password('WWWeisccn111@#')" # 进入数据库设置密码mysql -uroot -pWWWeisccn111@# -e "create database zabbix character set utf8 collate utf8_bin;" # create  [kriˈet] 创建 ;database [ˈdædəˌbeɪs] 数据库;character [ˈkɛrɪktər] 字符,设置字符类型,collate [kəˈlet] 核对字符 # 登陆数据库,创建库编码为utf8mysql -uroot -pWWWeisccn111@# -e "grant all on zabbix.* to 'zabbix'@'localhost' identified by '123'" # grant [grænt] 授权;all 所有,on 在...上;    授予zabbix账户在 localhost [ləʊkæl'həʊst] 本机的所有权限; identified [aɪ'dentɪfaɪd] 识别(设置密码) # identified [aɪ'dentɪfaɪd] 标识;by 由 123密码:设置zabbix 的 DBPassword # 123 是密码,需要单引号,数据库账户和本机需要# 此处已经修改bugfind查看数据库文件createmysql=$(find / -name "create.sql.gz") ; echo "$createmysql 数据库文件导入中,请耐心等待!" # 查找文件路径并打印/usr/bin/zcat $createmysql | mysql -uzabbix -p123 zabbix # 导入数据库,登陆数据,用户名zabbix 密码123,并且进入数据库zabbix # zcat 查看压缩包的文件,管道到登陆数据库里面去执行# sed -i "N;110i\DBPassword=123" /etc/zabbix/zabbix_server.conf  # 配置zabbix密码NRuser=`cat -n /etc/zabbix/zabbix_server.conf | grep "DBUser=zabbix" |awk '{print $1}' | sed "s/ //g"` ; echo $NRusersed -i "/DBPassword=123/d" /etc/zabbix/zabbix_server.confsed -i "$NRuser a\DBPassword=123" /etc/zabbix/zabbix_server.conf/usr/bin/systemctl restart httpd zabbix-server zabbix-agent/usr/bin/systemctl enable httpd zabbix-server zabbix-agent # enable [ɛˈnebəl] 启动; 开机启动echo "请用浏览器访问:http://$ip/zabbix安装配置:数据库名:zabbix数据库用户:zabbix密码:123登陆账户/密码:Admin/zabbix"}agent(){yum -y install zabbix-agentread -p "请输入Zabbix-serve的ip地址:" server_IPsed -i s/127.0.0.1/$server_IP/g /etc/zabbix/zabbix_agentd.conf /bin/systemctl restart zabbix-agent.service}##################install menu###########################MYDATE=`date +%d/%m/%y` # 定义一个时间变量:格式化字符为:十进制日期,月份,年份抹除100THIS_HOST=`hostname -s`USER=`whoami`while :do  tput clear  echo " # cat 与echo 相似,这里打印显示一段话;由 aMAYDAY  开始,也由它来结束;---------------------------------------------------------User:$USER            Host:$THIS_HOST        Date:$MYDATE# cat 这里直接打印字符串和变量的值---------------------------------------------------------            1:安装 zabbix-server和zabbix-agent            2:只安装 zabbix-agent     H:帮助            Q:退出---------------------------------------------------------" # 结束打印标记echo -e -n "\tYour Choice [1,2,Q]>" # -e 开启特殊字符转换 \t上一行换行;-n 它的下一行不换行打印;read CHOICE # 紧接着上一行的打印字符串,接着让用户输入信息,将输入信息写入变量 $CHOICE  case $CHOICE in # 判断变量是一下情形    1) server # 为 1 执行 server 函数       ;;    2) agent       ;;    3) who       ;;    H|h) # 输入为 H 则打印一段话       echo "          Zabbix-server是服务端,Zabbix-agent是客户端!" # 打印结束,MAYDAY 他为开始,也以他为结束       ;;    Q|q) exit 0 # 输入Q 退出    ;;    *)  echo -e "\t\007 输入有有误!" # 其他所有情况,提示       ;;  esac # case 判断结束echo -e -n "\t按任意键返回菜单!"read DUMMYdone# 脚本执行: yum install -y wget ; rm -rf zabbix.sh ; wget eisc.cn/file/shell/zabbix.sh ; chmod 755 zabbix.sh ; source zabbix.sh
 3   3  765天前
admin
486
【漏洞公告】CVE-2016-10009:OpenSSH远程代码执行漏洞#---- 1. 升级 zlib ----#wget wget http://zlib.net/zlib-1.2.11.tar.gztar zxvf zlib-1.2.11.tar.gzcd zlib-1.2.11./configuremakemake installll /usr/local/lib                                # 查看版本#---- 升级openssl-flips ----#wget https://www.openssl.org/source/openssl-fips-2.0.14.tar.gztar zxvf openssl-fips-2.0.14.tar.gzcd openssl-fips-2.0.14./configmakemake install#------- 升级openssl ---------#wget https://www.openssl.org/source/openssl-1.0.2i.tar.gztar zxvf openssl-1.0.2i.tar.gzcd openssl-1.0.2i./configmakemake installln -s /usr/local/lib64/libssl.so.1.0 /usr/lib64/libssl.so.1.0ln -s /usr/local/lib64/libcrypto.so.1.0 /usr/lib64/libcrypto.so.1.0ln -s /usr/local/ssl/bin/openssl /usr/bin/opensslyum install pam*  -y#-------- 安装 openssh ---------#wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.4p1.tar.gztar zxvf openssh-7.4p1.tar.gzcd openssh-7.4p1./configure   --prefix=/usr   --sysconfdir=/etc/ssh   --with-md5-passwords   --with-pam    --with-privsep-path=/var/lib/sshd  --with-ssl-dir=/usr/local/lib64   --without-hardeningmakemake install# 备份sshd文件,重命名为sshd_20170209_oldmv /etc/init.d/sshd  /etc/init.d/sshd_20170209_old# 复制配置文件、赋权、添加到开机启动项cd /root/openssh-7.4p1/contrib/redhatcp sshd.init  /etc/init.d/sshdcp ssh_config /etc/ssh/ssh_config# 根据提示,输入y进行覆盖(若对原文件重命名,则无需覆盖)cp -p sshd_config /etc/ssh/sshd_config# 根据提示,输入y进行覆盖(若对原文件重命名,则无需覆盖)chmod u+x /etc/init.d/sshdchkconfig --add sshdchkconfig sshd on# 重启sshd服务service sshd restart#------ 查看版本 ------#ssh -VOpenSSH_7.4p1, OpenSSL 1.0.2i  22 Sep 2016https://help.aliyun.com/document_detail/48573.htm
 0   0  288天前
admin
453
vi /etc/ssh/sshd_configDenyUsers root                                         # 再sshd 配置文件底部写入禁止admin 远程sshd 登录AllowUsers eisc root                                  # 允许用户登录:eisc 和 rootsystemctl restart sshd                                 # 重启sshd 服务普通用户添加  sudo  超级权限再 /etc/sudoers 文件添加底部:eisc ALL=(ALL) ALL表示:eisc用户拥有sudo超级权限
 0   0  232天前
admin
413
您可以找到 之前的数据库文件。一般是 /www/server/data 这个目录下文件。通过 cp 复制部分数据库文件,但是.pid 无法直接使用,只能将其移动到其他目录后再进行拷贝到现有文件。然后重新新建数据名称您将数据库文件复制到到现有数据库目录后,将目录授权给mysql ,宝塔新建数据库。chown -R mysql:mysql /www/server/data参考卸载数据盘:https://help.aliyun.com/document_detail/25447.html云盘使用完了卸载云盘,释放拷贝完了不需要的云盘:https://help.aliyun.com/document_detail/33828.html
 0   0  219天前
admin
119
nano s.c#include<stdio.h> #include<stdlib.h> #include<netinet/in.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<unistd.h> #define BACKLOG 5 //完成三次握手但没有accept的队列的长度 #define CONCURRENT_MAX 8 //应用层同时可以处理的连接 #define SERVER_PORT 10000 #define BUFFER_SIZE 1024 #define QUIT_CMD ".quit" int client_fds[CONCURRENT_MAX]; int main(int argc, const char * argv[]) { char input_msg[BUFFER_SIZE]; char recv_msg[BUFFER_SIZE]; //本地地址 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = inet_addr("0.0.0.0"); bzero(&(server_addr.sin_zero), 8); //创建socket int server_sock_fd = socket(AF_INET, SOCK_STREAM, 0); if(server_sock_fd == -1) { perror("socket error"); return 1; } //绑定socket int bind_result = bind(server_sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(bind_result == -1) { perror("bind error"); return 1; } //listen if(listen(server_sock_fd, BACKLOG) == -1) { perror("listen error"); return 1; } //fd_set fd_set server_fd_set; int max_fd = -1; struct timeval tv; //超时时间设置 while(1) { tv.tv_sec = 20; tv.tv_usec = 0; FD_ZERO(&server_fd_set); FD_SET(STDIN_FILENO, &server_fd_set); if(max_fd <STDIN_FILENO) { max_fd = STDIN_FILENO; } //printf("STDIN_FILENO=%d\n", STDIN_FILENO); //服务器端socket FD_SET(server_sock_fd, &server_fd_set); // printf("server_sock_fd=%d\n", server_sock_fd); if(max_fd < server_sock_fd) { max_fd = server_sock_fd; } //客户端连接 for(int i =0; i < CONCURRENT_MAX; i++) { //printf("client_fds[%d]=%d\n", i, client_fds[i]); if(client_fds[i] != 0) { FD_SET(client_fds[i], &server_fd_set); if(max_fd < client_fds[i]) { max_fd = client_fds[i]; } } } int ret = select(max_fd + 1, &server_fd_set, NULL, NULL, &tv); if(ret < 0) { perror("select 出错\n"); continue; } else if(ret == 0) { printf("select 超时\n"); continue; } else { //ret 为未状态发生变化的文件描述符的个数 if(FD_ISSET(STDIN_FILENO, &server_fd_set)) { printf("发送消息:\n"); bzero(input_msg, BUFFER_SIZE); fgets(input_msg, BUFFER_SIZE, stdin); //输入“.quit"则退出服务器 if(strcmp(input_msg, QUIT_CMD) == 0) { exit(0); } for(int i = 0; i < CONCURRENT_MAX; i++) { if(client_fds[i] != 0) { printf("client_fds[%d]=%d\n", i, client_fds[i]); send(client_fds[i], input_msg, BUFFER_SIZE, 0); // send(client_fds[i],"I is server",24,0); // 自定义:服务器发送消息 } } } if(FD_ISSET(server_sock_fd, &server_fd_set)) { //有新的连接请求 struct sockaddr_in client_address; socklen_t address_len; int client_sock_fd = accept(server_sock_fd, (struct sockaddr *)&client_address, &address_len); printf("new connection client_sock_fd = %d\n", client_sock_fd); if(client_sock_fd > 0) { int index = -1; for(int i = 0; i < CONCURRENT_MAX; i++) { if(client_fds[i] == 0) { index = i; client_fds[i] = client_sock_fd; break; } } if(index >= 0) { printf("新客户端(%d)加入成功 %s:%d\n", index, inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port)); } else { bzero(input_msg, BUFFER_SIZE); strcpy(input_msg, "服务器加入的客户端数达到最大值,无法加入!\n"); send(client_sock_fd, input_msg, BUFFER_SIZE, 0); printf("客户端连接数达到最大值,新客户端加入失败 %s:%d\n", inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port)); } } } for(int i =0; i < CONCURRENT_MAX; i++) { if(client_fds[i] !=0) { if(FD_ISSET(client_fds[i], &server_fd_set)) { //处理某个客户端过来的消息 bzero(recv_msg, BUFFER_SIZE); long byte_num = recv(client_fds[i], recv_msg, BUFFER_SIZE, 0); if (byte_num > 0) { if(byte_num > BUFFER_SIZE) { byte_num = BUFFER_SIZE; } recv_msg[byte_num] = '\0'; printf("客户端(%d):%s\n", i, recv_msg); // 客户端 ID + 内容 //---------------------- 自定义:服务器发送消息 ----------------- send(client_fds[i],"I is server Paraphrase client: (%d),i",60,0); // send(client_fds[i],recv_msg,byte_num,0); // 函数,内容,长度,0 } else if(byte_num < 0) { printf("从客户端(%d)接受消息出错.\n", i); } else { FD_CLR(client_fds[i], &server_fd_set); client_fds[i] = 0; printf("客户端(%d)退出了\n", i); } } } } } } return 0; } nano  c1.c#include<stdio.h> #include<stdlib.h> #include<netinet/in.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<unistd.h> #define BUFFER_SIZE 1024 int main(int argc, const char * argv[]) { struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(10000); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); bzero(&(server_addr.sin_zero), 8); int server_sock_fd = socket(AF_INET, SOCK_STREAM, 0); if(server_sock_fd == -1) { perror("socket error"); return 1; } char recv_msg[BUFFER_SIZE]; char input_msg[BUFFER_SIZE]; //----------- 自定义消息 ---------------- send(server_sock_fd,"client one connect server ok ",24,0); if(connect(server_sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == 0) { fd_set client_fd_set; struct timeval tv; while(1) { tv.tv_sec = 20; tv.tv_usec = 0; FD_ZERO(&client_fd_set); FD_SET(STDIN_FILENO, &client_fd_set); FD_SET(server_sock_fd, &client_fd_set); select(server_sock_fd + 1, &client_fd_set, NULL, NULL, &tv); if(FD_ISSET(STDIN_FILENO, &client_fd_set)) { bzero(input_msg, BUFFER_SIZE); fgets(input_msg, BUFFER_SIZE, stdin); if(send(server_sock_fd, input_msg, BUFFER_SIZE, 0) == -1) { perror("发送消息出错!\n"); } //----------- 自定义消息 ---------------- // send(server_sock_fd,"client one",24,0); } if(FD_ISSET(server_sock_fd, &client_fd_set)) { bzero(recv_msg, BUFFER_SIZE); long byte_num = recv(server_sock_fd, recv_msg, BUFFER_SIZE, 0); if(byte_num > 0) { if(byte_num > BUFFER_SIZE) { byte_num = BUFFER_SIZE; } recv_msg[byte_num] = '\0'; printf("服务器:%s\n", recv_msg); } else if(byte_num < 0) { printf("接受消息出错!\n"); } else { printf("服务器端退出!\n"); exit(0); } } } //} #include<stdio.h> #include<stdlib.h> #include<netinet/in.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<unistd.h> #define BUFFER_SIZE 1024 int main(int argc, const char * argv[]) { struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(10000); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); bzero(&(server_addr.sin_zero), 8); int server_sock_fd = socket(AF_INET, SOCK_STREAM, 0); if(server_sock_fd == -1) { perror("socket error"); return 1; } char recv_msg[BUFFER_SIZE]; char input_msg[BUFFER_SIZE]; if(connect(server_sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == 0) { fd_set client_fd_set; struct timeval tv; while(1) { tv.tv_sec = 20; tv.tv_usec = 0; FD_ZERO(&client_fd_set); FD_SET(STDIN_FILENO, &client_fd_set); FD_SET(server_sock_fd, &client_fd_set); select(server_sock_fd + 1, &client_fd_set, NULL, NULL, &tv); if(FD_ISSET(STDIN_FILENO, &client_fd_set)) { bzero(input_msg, BUFFER_SIZE); fgets(input_msg, BUFFER_SIZE, stdin); if(send(server_sock_fd, input_msg, BUFFER_SIZE, 0) == -1) { perror("发送消息出错!\n"); } //----------- 自定义消息 ---------------- send(server_sock_fd,"client two",24,0); } if(FD_ISSET(server_sock_fd, &client_fd_set)) { bzero(recv_msg, BUFFER_SIZE); long byte_num = recv(server_sock_fd, recv_msg, BUFFER_SIZE, 0); if(byte_num > 0) { if(byte_num > BUFFER_SIZE) { byte_num = BUFFER_SIZE; } recv_msg[byte_num] = '\0'; printf("服务器:%s\n", recv_msg); } else if(byte_num < 0) { printf("接受消息出错!\n"); } else { printf("服务器端退出!\n"); exit(0); } } } //} } return 0; } } return 0; } nano c2.c
 0   0  47天前
admin
163
T568A线序为:白绿 绿 白橙 蓝 白蓝 橙 白棕 棕T568B线序为:白橙 橙 白绿 蓝 白蓝 绿 白棕 棕我们常用的就是T568B标准,1、传输数据正极 Tx+2、传输数据负极 Tx-3、接收数据正极 Rx+4、空5、空6、接受数据负极 Rx-7、空8、空当然这是在百兆以下是这样,千兆网络就是8根全用上了了标准568B:橙白-1,橙-2,绿白-3,蓝-4,蓝白-5,绿-6,棕白-7,棕-8。标准568A:绿白-1,绿-2,橙白-3,蓝-4,蓝白-5,橙-6,棕白-7,棕-8。标准568B:橙白-1,橙-2,绿白-3,蓝-4,蓝白-5,绿-6,棕白-7,棕-8。即直连线:568B-568B,568A-568A,交叉线:568A-568B
 0   0  70天前
admin
155
#include <stdio.h> void dec2n(int x, int n); int main() {    int x;       printf("输入一个十进制整数: ");    scanf("%d", &x);       dec2n(x, 2); //   dec2n(x, 8);    dec2n(x, 16);       return 0;    }         void dec2n(int x, int n)    {       int a[80];       int i, j=0, k;    do    {        i=x%n;        a[j]=i;        j++;        x=x/n;    }    while(x);    for(k=j-1;k>=0;k--)    {        if(a[k]>9)           printf("%c",a[k]-10+'A');        else           printf("%d",a[k]);            }    printf("\n");   }
 0   0  92天前
admin
170
C 库函数 - fopen() C 标准库 - <stdio.h>描述C 库函数 FILE *fopen(const char *filename, const char *mode) 使用给定的模式 mode 打开 filename 所指向的文件。声明下面是 fopen() 函数的声明。FILE *fopen(const char *filename, const char *mode)参数filename -- 字符串,表示要打开的文件名称。mode -- 字符串,表示文件的访问模式,可以是以下表格中的值:模式描述"r"打开一个用于读取的文件。该文件必须存在。"w"创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。"a"追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。"r+"打开一个用于更新的文件,可读取也可写入。该文件必须存在。"w+"创建一个用于读写的空文件。"a+"打开一个用于读取和追加的文件。返回值该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。#include <stdio.h>int main(){       FILE *fp = NULL;// 定义一个指针变量,默认为空,指针变量格式星号开头    fp = fopen("test.txt", "r+");                            // 指针变量为  fopen 打开一个文件 指定文件名和打开模式函数:r 读取    fprintf(fp, "This is testing for fprintf...\n");   // 将字符串写入文件:$fp 是 test.txt    fseek(fp, 10, SEEK_SET);    if (fputc(65,fp) == EOF) {        printf("fputc fail");       }       fclose(fp);}fseek 可以移动文件指针到指定位置读,或插入写:int fseek(FILE *stream, long offset, int whence);fseek 设置当前读写点到 offset 处, whence 可以是 SEEK_SET,SEEK_CUR,SEEK_END 这些值决定是从文件头、当前点和文件尾计算偏移量 offset。你可以定义一个文件指针 FILE *fp,当你打开一个文件时,文件指针指向开头,你要指到多少个字节,只要控制偏移量就好,例如, 相对当前位置往后移动一个字节:fseek(fp,1,SEEK_CUR); 中间的值就是偏移量。 如果你要往前移动一个字节,直接改为负值就可以:fseek(fp,-1,SEEK_CUR)。执行以下实例前,确保当前目录下 test.txt 文件已创建:注意: 只有用 r+ 模式打开文件才能插入内容,w 或 w+ 模式都会清空掉原来文件的内容再来写,a 或 a+ 模式即总会在文件最尾添加内容,哪怕用 fseek() 移动了文件指针位置。
 0   0  92天前
admin
145
#include<stdio.h>int days_of_year(int year, int month, int day);int main(){    int year, month, day;    int days;    printf("请输入三个数字:");    while (scanf("%d%d%d", &year, &month, &day) != EOF)// scanf 是c语言获取用户输入字符的函数,    {        days = days_of_year(year, month, day);        printf("%4d-%02d-%02d是这一年中的第%d天.\n\n", year, month, day, days);    }    return 0;}int days_of_year(int year, int month, int day){    int n=0;    int i;    int x[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))        x[1] = 29;    for (i = 0; i < month-1; i++)        n = n + x[i];    return n + day;}#--------------- 结果 ------------#2022 8 12022-08-01是这一年中的第213天.
 0   0  92天前
admin
140
#---- 数组 ----##include <stdio.h> int main (){   int n[ 10 ]; // int 整型数组n  是一个包含 10 个整数的数组    int i,j;// 再次声明变量  i  和 j  为int 整型    /* 初始化数组元素 */            for ( i = 0; i < 10; i++ )   {      n[ i ] = i + 100; /* 设置元素 i 为 i + 100 */   }// 使用for 循环,将n 数组的角标-1 开始,逐步赋值:0+100 ,直到 9+100 结束。      /* 输出数组中每个元素的值 */   for (j = 0; j < 10; j++ )   {      printf("数组n元素的值:[%d] = %d\n", j, n[j] );      // %d  是打印结果为整数,对后面的变量  j 和 数组角标对应的值 n[j] 两个变量进行约束   }    return 0;}#---- 枚举 ----# enum 枚举名 {枚举元素1,枚举元素2,……};#include <stdio.h> enum DAY{      MON=1, TUE, WED, THU, FRI, SAT, SUN} day;// 定义枚举类型DAY 时间,的同时定义枚举变量 day//  enum 枚举名 {枚举元素1,枚举元素2,……};int main(){    // 遍历枚举元素    for (day = MON; day <= SUN; day++) {        printf("枚举元素:%d \n", day);    }}#--------- 指针 -----------##include <stdio.h> int main (){   int  var = 20;                                                   // int 实际常规变量   int  *ip;                                                           // 指针变量的声明     ip = &var;                                                      // 在指针变量中存储 var 的地址     printf("var 变量的地址: %p\n", &var  );     // 在指针变量中存储的地址   printf("ip 变量存储的地址: %p\n", ip );   printf("*ip 变量的值: %d\n", *ip );            // 使用指针访问值    return 0;}
 0   0  92天前
admin
137
#--- 函数声明 ----#return_type function_name( parameter list );针对上面定义的函数 max(),以下是函数声明:int max(int num1, int num2);在函数声明中: 变量的类型必须。有类型没有变量,耶稣有效的:int max(int, int);#include <stdio.h> /* 函数声明 */int max(int num1, int num2); int main (){   /* 局部变量定义 */   int a = 100;   int b = 200;   int ret;    /* 调用函数来获取最大值 */   ret = max(a, b);    printf( "Max value is : %d\n", ret );    return 0;} /* 函数返回两个数中较大的那个数 */int max(int num1, int num2) {   /* 局部变量声明 */   int result;    if (num1 > num2)      result = num1;   else      result = num2;    return result; }#------------- 作用域  -----------##include <stdio.h> /* 全局变量声明 */int a = 20; int main (){  /* 在主函数中的局部变量声明 */  int a = 10;  int b = 20;  int c = 0;  int sum(int, int);   printf ("value of a in main() = %d\n",  a);  c = sum( a, b);  printf ("value of c in main() = %d\n",  c);   return 0;} /* 添加两个整数的函数 */int sum(int a, int b){    printf ("value of a in sum() = %d\n",  a);    printf ("value of b in sum() = %d\n",  b);     return a + b;}
 0   0  92天前
admin
149
循环类型C 语言提供了以下几种循环类型。点击链接查看每个类型的细节。循环类型描述while 循环当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。for 循环多次执行一个语句序列,简化管理循环变量的代码。do...while 循环除了它是在循环主体结尾测试条件外,其他与 while 语句类似。嵌套循环您可以在 while、for 或 do..while 循环内使用一个或多个循环。循环控制语句循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。C 提供了下列的循环控制语句。点击链接查看每个语句的细节。控制语句描述break 语句终止循环或 switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。continue 语句告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。goto 语句将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。无限循环如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。实例#include <stdio.h> int main () { for( ; ; ) { printf("该循环会永远执行下去!\n"); } return 0; }#############################  循环 ################################-------- while 循环  --------##include <stdio.h> int main (){   /* 局部变量定义 */   int a = 10;   /* while 循环执行:  条件:a 的值要小于20 ,否之停止循环,开关为 a++  表示步长为 1 */   while( a < 20 )   {      printf("a 的值: %d\n", a);      a++;// a += 2;   表示步长为2    根据c语言赋值规则,a += 2  表示为:a = a+2    他本身自动加 2   为 a++ 的步长表示// 参考:赋值运算符:http://eisc.cn/index.php?c=read&id=1110&page=1   }    return 0;}#-------- for 循环  --------##include <stdio.h> int main (){   /* for 循环执行 */   for( int a = 10; a < 20; a = a + 2 )// 设置步长为 2   表示 :  a = a + 2 换算为: a += 2   {      printf("a 的值: %d\n", a);   }    return 0;// 结束函数}#-------- 嵌套循环  --------##include <stdio.h> int main (){   /* 局部变量定义 i 和 j 为整数 int 类型 */   int i, j;      for(i=2; i<100; i++) {      for(j=2; j <= (i/j); j++)        if(!(i%j)) break; // 如果找到,则不是质数      if(j > (i/j)) printf("%d 是质数\n", i);   }    return 0;}
 0   0  94天前
admin
132
auto 存储类auto 存储类是所有局部变量默认的存储类。{   int mount;   auto int month;}上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量。register 存储类register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。{   register int  miles;}#include <stdio.h> /* 函数声明 */void func1(void); static int count=10;        /* 全局变量 - static 是默认的 */ int main(){  while (count--) {      func1();  }  return 0;} void func1(void){/* 'thingy' 是 'func1' 的局部变量 - 只初始化一次 * 每次调用函数 'func1' 'thingy' 值不会被重置。 */                  static int thingy=5;  thingy++;  printf(" thingy 为 %d , count 为 %d\n", thingy, count);}extern 存储类extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:第一个文件:main.c实例#include <stdio.h> int count ;extern void write_extern(); int main(){   count = 5;   write_extern();}第二个文件:support.c实例#include <stdio.h> extern int count; void write_extern(void){   printf("count is %d\n", count);}#----------------- 运算符 ----------------#算术运算符下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:运算符描述实例+把两个操作数相加A + B 将得到 30-从第一个操作数中减去第二个操作数A - B 将得到 -10*把两个操作数相乘A * B 将得到 200/分子除以分母B / A 将得到 2%取模运算符,整除后的余数B % A 将得到 0++自增运算符,整数值增加 1A++ 将得到 11--自减运算符,整数值减少 1A-- 将得到 9实例请看下面的实例,了解 C 语言中所有可用的算术运算符:实例#include <stdio.h> int main() { int a = 21; int b = 10; int c ; c = a + b; printf("Line 1 - c 的值是 %d\n", c ); c = a - b; printf("Line 2 - c 的值是 %d\n", c ); c = a * b; printf("Line 3 - c 的值是 %d\n", c ); c = a / b; printf("Line 4 - c 的值是 %d\n", c ); c = a % b; printf("Line 5 - c 的值是 %d\n", c ); c = a++; // 赋值后再加 1 ,c 为 21,a 为 22 printf("Line 6 - c 的值是 %d\n", c ); c = a--; // 赋值后再减 1 ,c 为 22 ,a 为 21 printf("Line 7 - c 的值是 %d\n", c ); }当上面的代码被编译和执行时,它会产生下列结果:Line 1 - c 的值是 31 Line 2 - c 的值是 11 Line 3 - c 的值是 210 Line 4 - c 的值是 2 Line 5 - c 的值是 1 Line 6 - c 的值是 21 Line 7 - c 的值是 22以下实例演示了 a++ 与 ++a 的区别:实例#include <stdio.h> int main() { int c; int a = 10; c = a++; printf("先赋值后运算:\n"); printf("Line 1 - c 的值是 %d\n", c ); printf("Line 2 - a 的值是 %d\n", a ); a = 10; c = a--; printf("Line 3 - c 的值是 %d\n", c ); printf("Line 4 - a 的值是 %d\n", a ); printf("先运算后赋值:\n"); a = 10; c = ++a; printf("Line 5 - c 的值是 %d\n", c ); printf("Line 6 - a 的值是 %d\n", a ); a = 10; c = --a; printf("Line 7 - c 的值是 %d\n", c ); printf("Line 8 - a 的值是 %d\n", a ); }以上程序执行输出结果为:先赋值后运算: Line 1 - c 的值是 10 Line 2 - a 的值是 11 Line 3 - c 的值是 10 Line 4 - a 的值是 9 先运算后赋值: Line 5 - c 的值是 11 Line 6 - a 的值是 11 Line 7 - c 的值是 9 Line 8 - a 的值是 9关系运算符下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:运算符描述实例==检查两个操作数的值是否相等,如果相等则条件为真。(A == B) 为假。!=检查两个操作数的值是否相等,如果不相等则条件为真。(A != B) 为真。>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(A > B) 为假。<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(A < B) 为真。>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(A >= B) 为假。<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。(A <= B) 为真。实例请看下面的实例,了解 C 语言中所有可用的关系运算符:实例#include <stdio.h> int main() { int a = 21; int b = 10; int c ; if( a == b ) { printf("Line 1 - a 等于 b\n" ); } else { printf("Line 1 - a 不等于 b\n" ); } if ( a < b ) { printf("Line 2 - a 小于 b\n" ); } else { printf("Line 2 - a 不小于 b\n" ); } if ( a > b ) { printf("Line 3 - a 大于 b\n" ); } else { printf("Line 3 - a 不大于 b\n" ); } /* 改变 a 和 b 的值 */ a = 5; b = 20; if ( a <= b ) { printf("Line 4 - a 小于或等于 b\n" ); } if ( b >= a ) { printf("Line 5 - b 大于或等于 a\n" ); } }当上面的代码被编译和执行时,它会产生下列结果:Line 1 - a 不等于 b Line 2 - a 不小于 b Line 3 - a 大于 b Line 4 - a 小于或等于 b Line 5 - b 大于或等于 a逻辑运算符下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:运算符描述实例&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。||称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。(A || B) 为真。!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。实例请看下面的实例,了解 C 语言中所有可用的逻辑运算符:实例#include <stdio.h> int main() { int a = 5; int b = 20; int c ; if ( a && b ) { printf("Line 1 - 条件为真\n" ); } if ( a || b ) { printf("Line 2 - 条件为真\n" ); } /* 改变 a 和 b 的值 */ a = 0; b = 10; if ( a && b ) { printf("Line 3 - 条件为真\n" ); } else { printf("Line 3 - 条件为假\n" ); } if ( !(a && b) ) { printf("Line 4 - 条件为真\n" ); } }当上面的代码被编译和执行时,它会产生下列结果:Line 1 - 条件为真 Line 2 - 条件为真 Line 3 - 条件为假 Line 4 - 条件为真位运算符位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:pqp & qp | qp ^ q00000010111111010011假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:A = 0011 1100B = 0000 1101-----------------A&B = 0000 1100A|B = 0011 1101A^B = 0011 0001~A  = 1100 0011下表显示了 C 语言支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:运算符描述实例&按位与操作,按二进制位进行"与"运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;(A & B) 将得到 12,即为 0000 1100|按位或运算符,按二进制位进行"或"运算。运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;(A | B) 将得到 61,即为 0011 1101^异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;(A ^ B) 将得到 49,即为 0011 0001~取反运算符,按二进制位进行"取反"运算。运算规则:~1=-2; ~0=-1;(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。<<二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。A << 2 将得到 240,即为 1111 0000>>二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。A >> 2 将得到 15,即为 0000 1111实例请看下面的实例,了解 C 语言中所有可用的位运算符:实例#include <stdio.h> int main() { unsigned int a = 60; /* 60 = 0011 1100 */ unsigned int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ printf("Line 1 - c 的值是 %d\n", c ); c = a | b; /* 61 = 0011 1101 */ printf("Line 2 - c 的值是 %d\n", c ); c = a ^ b; /* 49 = 0011 0001 */ printf("Line 3 - c 的值是 %d\n", c ); c = ~a; /*-61 = 1100 0011 */ printf("Line 4 - c 的值是 %d\n", c ); c = a << 2; /* 240 = 1111 0000 */ printf("Line 5 - c 的值是 %d\n", c ); c = a >> 2; /* 15 = 0000 1111 */ printf("Line 6 - c 的值是 %d\n", c ); }当上面的代码被编译和执行时,它会产生下列结果:Line 1 - c 的值是 12 Line 2 - c 的值是 61 Line 3 - c 的值是 49 Line 4 - c 的值是 -61 Line 5 - c 的值是 240 Line 6 - c 的值是 15赋值运算符下表列出了 C 语言支持的赋值运算符:运算符描述实例=简单的赋值运算符,把右边操作数的值赋给左边操作数C = A + B 将把 A + B 的值赋给 C+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数C += A 相当于 C = C + A-=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数C -= A 相当于 C = C - A*=乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数C *= A 相当于 C = C * A/=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数C /= A 相当于 C = C / A%=求模且赋值运算符,求两个操作数的模赋值给左边操作数C %= A 相当于 C = C % A<<=左移且赋值运算符C <<= 2 等同于 C = C << 2>>=右移且赋值运算符C >>= 2 等同于 C = C >> 2&=按位与且赋值运算符C &= 2 等同于 C = C & 2^=按位异或且赋值运算符C ^= 2 等同于 C = C ^ 2|=按位或且赋值运算符C |= 2 等同于 C = C | 2实例请看下面的实例,了解 C 语言中所有可用的赋值运算符:实例#include <stdio.h> int main() { int a = 21; int c ; c = a; printf("Line 1 - = 运算符实例,c 的值 = %d\n", c ); c += a; printf("Line 2 - += 运算符实例,c 的值 = %d\n", c ); c -= a; printf("Line 3 - -= 运算符实例,c 的值 = %d\n", c ); c *= a; printf("Line 4 - *= 运算符实例,c 的值 = %d\n", c ); c /= a; printf("Line 5 - /= 运算符实例,c 的值 = %d\n", c ); c = 200; c %= a; printf("Line 6 - %%= 运算符实例,c 的值 = %d\n", c ); c <<= 2; printf("Line 7 - <<= 运算符实例,c 的值 = %d\n", c ); c >>= 2; printf("Line 8 - >>= 运算符实例,c 的值 = %d\n", c ); c &= 2; printf("Line 9 - &= 运算符实例,c 的值 = %d\n", c ); c ^= 2; printf("Line 10 - ^= 运算符实例,c 的值 = %d\n", c ); c |= 2; printf("Line 11 - |= 运算符实例,c 的值 = %d\n", c ); }当上面的代码被编译和执行时,它会产生下列结果:Line 1 - = 运算符实例,c 的值 = 21 Line 2 - += 运算符实例,c 的值 = 42 Line 3 - -= 运算符实例,c 的值 = 21 Line 4 - *= 运算符实例,c 的值 = 441 Line 5 - /= 运算符实例,c 的值 = 21 Line 6 - %= 运算符实例,c 的值 = 11 Line 7 - <<= 运算符实例,c 的值 = 44 Line 8 - >>= 运算符实例,c 的值 = 11 Line 9 - &= 运算符实例,c 的值 = 2 Line 10 - ^= 运算符实例,c 的值 = 0 Line 11 - |= 运算符实例,c 的值 = 2杂项运算符 ↦ sizeof & 三元下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :。运算符描述实例sizeof()返回变量的大小。sizeof(a) 将返回 4,其中 a 是整数。&返回变量的地址。&a; 将给出变量的实际地址。*指向一个变量。*a; 将指向一个变量。? :条件表达式如果条件为真 ? 则值为 X : 否则值为 Y实例请看下面的实例,了解 C 语言中所有可用的杂项运算符:实例#include <stdio.h> int main() { int a = 4; short b; double c; int* ptr; /* sizeof 运算符实例 */ printf("Line 1 - 变量 a 的大小 = %lu\n", sizeof(a) ); printf("Line 2 - 变量 b 的大小 = %lu\n", sizeof(b) ); printf("Line 3 - 变量 c 的大小 = %lu\n", sizeof(c) ); /* & 和 * 运算符实例 */ ptr = &a; /* 'ptr' 现在包含 'a' 的地址 */ printf("a 的值是 %d\n", a); printf("*ptr 是 %d\n", *ptr); /* 三元运算符实例 */ a = 10; b = (a == 1) ? 20: 30; printf( "b 的值是 %d\n", b ); b = (a == 10) ? 20: 30; printf( "b 的值是 %d\n", b ); }当上面的代码被编译和执行时,它会产生下列结果:Line 1 - 变量 a 的大小 = 4 Line 2 - 变量 b 的大小 = 2 Line 3 - 变量 c 的大小 = 8 a 的值是 4 *ptr 是 4 b 的值是 30 b 的值是 20C 中的运算符优先级运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7。下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。类别 运算符 结合性 后缀 () [] -> . ++ - -  从左到右 一元 + - ! ~ ++ - - (type)* & sizeof 从右到左 乘除 * / % 从左到右 加减 + - 从左到右 移位 << >> 从左到右 关系 < <= > >= 从左到右 相等 == != 从左到右 位与 AND & 从左到右 位异或 XOR ^ 从左到右 位或 OR | 从左到右 逻辑与 AND && 从左到右 逻辑或 OR || 从左到右 条件 ?: 从右到左 赋值 = += -= *= /= %=>>= <<= &= ^= |= 从右到左 逗号 , 从左到右 实例请看下面的实例,了解 C 语言中运算符的优先级:实例#include <stdio.h> main() { int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * c / d; // ( 30 * 15 ) / 5 printf("(a + b) * c / d 的值是 %d\n", e ); e = ((a + b) * c) / d; // (30 * 15 ) / 5 printf("((a + b) * c) / d 的值是 %d\n" , e ); e = (a + b) * (c / d); // (30) * (15/5) printf("(a + b) * (c / d) 的值是 %d\n", e ); e = a + (b * c) / d; // 20 + (150/5) printf("a + (b * c) / d 的值是 %d\n" , e ); return 0; }当上面的代码被编译和执行时,它会产生下列结果:(a + b) * c / d 的值是 90 ((a + b) * c) / d 的值是 90 (a + b) * (c / d) 的值是 90 a + (b * c) / d 的值是 50################################  判断语句 ##########################################判断语句C 语言提供了以下类型的判断语句。点击链接查看每个语句的细节。语句描述if 语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。if...else 语句一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。嵌套 if 语句您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。switch 语句一个 switch 语句允许测试一个变量等于多个值时的情况。嵌套 switch 语句您可以在一个 switch 语句内使用另一个 switch 语句。? : 运算符(三元运算符)我们已经在前面的章节中讲解了 条件运算符 ? :,可以用来替代 if...else 语句。它的一般形式如下:Exp1 ? Exp2 : Exp3;其中,Exp1、Exp2 和 Exp3 是表达式。请注意,冒号的使用和位置。? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个表达式的值。#include<stdio.h> int main(){    int num;     printf("输入一个数字 : ");    scanf("%d",&num); // 判断语句:将变量格式化为%d 整数    (num%2==0)?printf("偶数"):printf("奇数");//将变量整除2 为0 的判断为 偶数}#----------------------- if else 语句 ----------------------##include <stdio.h> int main (){   /* 局部变量定义 */   int a = 100;    /* 检查布尔条件 */   if( a < 20 )   {       /* 如果条件为真,则输出下面的语句 */       printf("a 小于 20\n" );   }   else   {       /* 如果条件为假,则输出下面的语句 */       printf("a 大于 20\n" );   }   printf("a 的值是 %d\n", a);    return 0;}#------------- if else if ---------------##include <stdio.h> int main (){   /* 局部变量定义 */   int a = 100;    /* 检查布尔条件 */   if( a == 10 )   {       /* 如果 if 条件为真,则输出下面的语句 */       printf("a 的值是 10\n" );   }   else if( a == 20 )   {       /* 如果 else if 条件为真,则输出下面的语句 */       printf("a 的值是 20\n" );   }   else if( a == 30 )   {       /* 如果 else if 条件为真,则输出下面的语句 */       printf("a 的值是 30\n" );   }   else   {       /* 如果上面条件都不为真,则输出下面的语句 */       printf("没有匹配的值\n" );   }   printf("a 的准确值是 %d\n", a );    return 0;}
 0   0  94天前
admin
149
C 常量常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。常量就像是常规的变量,只不过常量的值在定义后不能进行修改。整数常量整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。下面列举几个整数常量的实例:212 /* 合法的 */ 215u /* 合法的 */ 0xFeeL /* 合法的 */ 078 /* 非法的:8 不是八进制的数字 */ 032UU /* 非法的:不能重复后缀 */以下是各种类型的整数常量的实例:85 /* 十进制 */ 0213 /* 八进制 */ 0x4b /* 十六进制 */ 30 /* 整数 */ 30u /* 无符号整数 */ 30l /* 长整数 */ 30ul /* 无符号长整数 */浮点常量浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。下面列举几个浮点常量的实例:3.14159 /* 合法的 */ 314159E-5L /* 合法的 */ 510E /* 非法的:不完整的指数 */ 210f /* 非法的:没有小数或指数 */ .e55 /* 非法的:缺少整数或分数 */字符常量字符常量是括在单引号中,例如,'x' 可以存储在 char 类型的简单变量中。字符常量可以是一个普通的字符(例如 'x')、一个转义序列(例如 '\t'),或一个通用的字符(例如 '\u02C0')。在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:转义序列含义\\\ 字符\'' 字符\"" 字符\?? 字符\a警报铃声\b退格键\f换页符\n换行符\r回车\t水平制表符\v垂直制表符\ooo一到三位的八进制数\xhh . . .一个或多个数字的十六进制数下面的实例显示了一些转义序列字符:实例#include <stdio.h> int main() { printf("Hello\tWorld\n\n"); return 0; }当上面的代码被编译和执行时,它会产生下列结果:Hello World 字符串常量字符串字面值或常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。您可以使用空格做分隔符,把一个很长的字符串常量进行分行。下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。"hello, dear" "hello, \ dear" "hello, " "d" "ear"定义常量在 C 中,有两种简单的定义常量的方式:使用 #define 预处理器。使用 const 关键字。#define 预处理器下面是使用 #define 预处理器定义常量的形式:#define identifier value具体请看下面的实例:实例#include <stdio.h> #define LENGTH 10 #define WIDTH 5 #define NEWLINE '\n' int main() { int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }当上面的代码被编译和执行时,它会产生下列结果:value of area : 50const 关键字您可以使用 const 前缀声明指定类型的常量,如下所示:const type variable = value;const 声明常量要在一个语句内完成:具体请看下面的实例:实例#include <stdio.h> int main() { const int LENGTH = 10; const int WIDTH = 5; const char NEWLINE = '\n'; int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }当上面的代码被编译和执行时,它会产生下列结果:value of area : 501111111111
 0   0  94天前
guest
登录之后更精彩~
我的小伙伴
Powered by HadSky 7.7.16
© 2015-2022 PuYueTian
您的IP:8.219.134.200,2022-08-10 07:38:57,Processed in 0.08275 second(s).
Powered by HadSky
小绿叶技术博客