动态 版块 发帖 消息 我的
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
129
// 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
129
#------ 服务器端 ------##!/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
769
 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
443
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
378
 #    系统服务[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
350
 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
338
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
389
 #--- 代理服务器(外层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
807
# 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
564
#----- 创建专有网络和交换机 ------------##--- 已经存在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
487
【漏洞公告】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
211
public key is not available: NO_PUBKEY F57D4F59BD3DF454apt-key adv --recv-keys --keyserver keyserver.ubuntu.com F57D4F59BD3DF454# ubuntu 解决方案: 将报错的这个key,添加这个 keyyum adv --recv-keys --keyserver keyserver.ubuntu.com F57D4F59BD3DF454# centos 解决方案: 添加这个 key配置 apt 仓库源:http://eisc.cn/index.php?c=read&id=1070&page=1&cache=refresh清华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 源
 0   0  123天前
admin
411
[root@localhost ~]# cat /etc/docker/daemon.json{"registry-mirrors": ["https://hub-mirror.c.163.com"],"bip": "10.10.1.1/24"}systemctl daemon-reload ; service docker restart       # 重启docker# bip 指定网段为:10 网段掩码位错误将会导致docker无法重启 # registry mirrors                                 #  [ˈre dʒ   ɪs  tri]   lui ji s zui   注册     [ˈmɪ   rə  z]   镜像  mi rui ri
 0   0  304天前
admin
514
#!/bin/bash# 小绿叶技术博客扫段攻击拦截系统#抓包监控tcp攻击ip进行拦截。zhuabao(){echo "eisc 安防系统启动扫描,时间 :" `date +%Y-%m-%d-%H:%M:%y` >> /root/eisc-anfang.txt# 将firewalld 防火墙加入开机启动folder="/anfang/ip"mkdir -p $folder# 抓包等待30s 杀掉进程,符号 & 并列执行zdyljs=600timetcp=300tcpdump -nn > $folder/ipfwyuan.txt & sleep $timetcp ; killall -9 tcpdump ; sleep 3echo "访问限制tcp连接数;$zdyljs   抓包时长为 $timetcp"rm -rf $folder/ipfw.txtcat $folder/ipfwyuan.txt | grep S | awk -F" " '{print $3}' | awk -F"." '{print $1 "." $2 "." $3 "." $4}'  |sort  | uniq -c > $folder/ipfw.txt#sed -nr 's/(^|.*[^0-9])(([0-9]+\.){3}[0-9]+).*/\2/p' $folder/ipfwyuan.txt  |sort  | uniq -c > $folder/ipfw.txt#筛选出日志的ip 记录#sed -i "s/\[/ /g" $folder/ipfw.txt;sed -i "s/\]/ /g" $folder/ipfw.txt ; sed -i "s/>/ /g" $folder/ipfw.txt ; sed -i '/[a-zA-Z]/d' $folder/ipfw.txt ;#sed -i '/.../d' $folder/ipfw.txt ; sed -i '/:/d' $folder/ipfw.txt ; sed -i "/^$/d"  $folder/ipfw.txt# 清除文件特殊字符和空格sed -i "/^$/d" $folder/ipfw.txtcat $folder/ipfw.txt#--------------------------------  防火墙 ------------------------------------------#echo "查询数据库白名单:"mysql -h 10.111.111.2 -uenchantment -paA20211122@eisc -e "use enchantment;select * from setip"mysql -h 10.111.111.2 -uenchantment -paA20211122@eisc -e "use enchantment;select * from setip" >  /anfang/ip/bmd-ip.txt#查询数据库白名单,脚本每次执行查询一次数据库#---------- 白名单:判断是否拦截 -------#}# zhuabaobmd(){        file="/anfang/ip/bmd-ip.txt"            # 白名单文件        pd=`cat $file | awk -F" " '{print $3}' | grep $ip`                                                # 白名单文件打印第三列为ip地址                                                # 没有数据库可以删除查询数据库,可以直接写入        if [ ${#pd} -lt 7  ]                    # ${#}  符号标识字符串长度        then            echo "查询匹配 ip: $ip 的长度小于7 没有白名单,将被禁止访问 "        else            echo "ip: $ip 不小于7查询到数据有白名单,ip 不会被拦截"            ip=""        fi}#安全防火墙拦截规则执行firewalldfirewalldjz(){                 iptables -I INPUT -s  $ip -j DROP}#------------ ip 白名单:被封禁后解除限制 ------------#bmdIP(){# 小绿叶结界-解除ip限制,由ip白名单库放行 ip=(`cat /anfang/ip/bmd-ip.txt | awk -F" " '{print $3}' `)for((i>0;i<${#ip[*]};i++))    do        ip=${ip[$i] }        ipd=$(echo $ip | awk -F"." '{print $1 "." $2  "." $3 "."  "0/24"}')        echo "解除ip:$ip    解除ip网段:$ipd"               ID=`iptables -L -n --line-number | grep $ip | awk -F" " '{print $1}'` ; echo   "ID : $ID ip: $ip 将被解除限制访问" && iptables -D INPUT $ID               ID=`iptables -L -n --line-number | grep $ipd | awk -F" " '{print $1}'` ; echo   "ID : $ID ipd: $ipd 将被 解除限制访问" && iptables -D INPUT $ID               iptables -I INPUT -s $ip -p TCP --dport 1:65535 -j ACCEPT    done}#---------  安防监控异常 ip ---------#anfangip(){NR=$(cat $folder/ipfw.txt | wc -l); echo $NRipfw=(`cat $folder/ipfw.txt | awk -F" " '{print $2}'`) ; echo $ipfwfor((i=0;i<$NR;i++))  do     ljs=`cat $folder/ipfw.txt | grep ${ipfw[$i]} | awk -F" " '{print $1}'` ; echo "${ipfw[$i]} 连接数为: $ljs"     if [ $ljs -gt $zdyljs  ]         then                   ip=${ipfw[$i]}                   bmd                   firewalldjz                   echo "$ip 连接数为: $ljs    超过法制:$zdyljs 连接数 时间:" `date +%Y-%m-%d-%H:%M:%y` >> $folder/jinzhiip.txt         fi  done}#anfangip#---------  安防日志文件 ---------#filelog(){cat $folder/ipfw.txt >> $folder/rizhi.txtecho `date` >> $folder/rizhi.txt# 实时监控日志ipfw.txt存入长期保存ip地址库 rizhi.txt#cat $folder/rizhi.txt > /root/rizhi.txt}filelog##---------  安防监控异常 ip 网段 ---------#anfangipd(){cat /dev/null > $folder/saoduanrun.txt  # 情况实时计算网段库,重新计量记录cat $folder/ipfwyuan.txt| awk -F" " '{print $3}' | awk -F"." '{print $1 "." $2 "." $3}' |sort  | uniq -c > $folder/saoduanrun.txt ;echo "---------  获得实时日志 saoduanrun.txt 开始判断 -------------- "cat $folder/saoduanrun.txt >> $folder/saoduan.txt ; cat $folder/saoduan.txt > /root/saoduan.txt# 获得网段:实时日志 rizhi.txt 过滤ip段; 存入实时 saoduanrun.txt 扫段日志 ; 扫段日志长期保留ip网段库 saoduan.txtwdk=(`cat $folder/saoduanrun.txt | awk -F" " '{print $2 }'`)                                       # 定义ip段数组:打印第二列为ipNR=${#wdk[*]}                          # 数组的所有个数为个数for((i=0;i<$NR;i++))  do     wdsa=`cat $folder/saoduanrun.txt | grep ${wdk[$i]} | awk -F" " '{print $1}'`                                       # 查看文本,过滤ip,打印第一列为 并发数量     ip=${wdk[$i]}    if [ $wdsa -gt $zdyljs ]    then            bmd            ip=`echo "$ip.0/24"`            firewalldjz            echo "$ip 网段连接数为: $wdsl    超过法制:$zdyljs 连接数,被禁止访问 时间:" `date +%Y-%m-%d-%H:%M:%y` >> $folder/saoduan.txt     else            echo "$ip.0/24 没有违反规定并发:$zdyljs ,不进行限制  当前并发:  $wdsa "     fi  done}# anfangipd && bmdIP ; iptables -L -n --line-number | grep DROP# 拦截ip 与 ip 白名单解除限制# export eisc        # 全局变量 eisc# set unset eisc     # 取消全局变量 eisc# /etc/profile  ~/bashrc  环境变量#您在 /var/spool/mail/root 中有邮件function main(){      while :      do             zhuabao && anfangip && anfangipd && bmdIP && iptables -L -n --line-number | grep DROP              sleep 360      doneecho `date` "程序已经间隔 360 秒,继续运行"echo `date` "程序已经间隔 360 秒,继续运行"   >>  /root/eisc-anfang.txt}main
 0   2  304天前
admin
1215
#--- nginx 反向代理解析 -----#server{listen 80;listen 443;server_name www.kbash.cn;location / {     proxy_pass http://82.157.148.144;     index index.php index.html;  }}#------------------------------##!/bin/bash# 此处是lnmp环境的配置教程,搭建 lnmp 请参考:Linux centos下编译安装Lnmp shell脚本 完整版# nginx服务器部署多个网站,共用一个80端口。#首先备份配置文件:#-------------------------------  备份所有 .pid 的文件为 .pid.backup  --------------------------------#pidback=(`find / -name "*.pid"`)             # 定义一个小括号数组变量pidback  为 反引号里面的命令执行结果for i in ${pidback[*]}                     # for循环变量  i  是 数组变量里所有的元素,[*] 所有, [0] 第一个元素,默认从0 开始do                                      # do 开始执行循环if [ ! -e $i.backup ]                          # 判断参考:Shell if 条件判断文件或目录;字符串长度或为空,逻辑运算then                                    # 判断成立的情况执行echo "备份文件: $i 为: $i.backup"cp $i $i.backupelse                                      # 其他情况执行echo "已经存在备份文件: $i.backup"fi                                     # 结束判断done                                 # 结束循环#------------------------------------  在配置文件里绑定域名和目录 ------------------------------------ #nginxconf="/www/server/nginx/18" # nginx 所在目录www="/www/wwwroot" # web 网站所在路径echo "如果您的nginx 安装目录 不是 /www/server/nginx/18    请修改变量nginxconf 的值如果您的web目录 不是 /www/wwwroot    请修改变量 www 的值"read -p "请输入域名:" addressread -p "请输入网站路径:$www/" catalogueecho $address $www/$cataloguemkdir $nginxconf/vhost                 # 在nginx目录下 创建一个”vhost” 域名解析配置文件目录 touch $nginxconf/vhost/$address.conf   # 创建反向解析配置文件,多个网站需要创建多个配置文件,然后用cat 写入echo  $nginxconf/vhost/$address.conf echo "server{listen 80;  #监听端口设为 80。server_name $address;  #绑定多个域名  空格隔开。index index.php index.htm index.html;  #指定默认文件。root $www/$catalogue;  #指定网站根目录。# location /a  其中 /a 是为了区分名字        location /$catalogue {            root  $www/$catalogue ;            index  index.php index.html index.htm;        }  location ~ .php\$ {                         root           $www/$catalogue;                           fastcgi_pass 127.0.0.1:9000;                         fastcgi_index index.php;                         fastcgi_param  SCRIPT_FILENAME  \$document_root\$fastcgi_script_name;                         include        fastcgi_params;                 }} " >  $nginxconf/vhost/$address.confmkdir $www/$catalogue                      # 创建站点根目录echo "                                                         # 写入php测试文件aaaaaaaaaaaaaa########  eisc.cn  小绿叶技术博客脚本开发商 【nginx 多网站域名绑定】,测试php功能  ########### BUG 未添加反向解析的域名都默认绑定再第一个web 网站<?phpphpinfo()?>########  eisc.cn  小绿叶技术博客脚本开发商 【nginx 多网站域名绑定】,测试php功能  ########### BUG 未添加反向解析的域名都默认绑定再第一个web 网站" > $www/$catalogue/eisc.cn.phpcurl $address/eisc.cn.php#------------------------------------  nginx 主配置文件  -------------------------------------------------#cat /dev/null > $nginxconf/conf/nginx.conf                                                  # 前面已经备份了配置文件,清空nginx配置文件内容,重新写入echo "worker_processes  1;pid    /usr/bin/nginx.pid;#注意:nginx 的 pid 目录events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;        include $nginxconf/vhost/*.conf;# 注意,inclde 引入 反向解析配置文件路径#此处一般为localhost  不启默认路径网站    server {        listen       80;        server_name  127.0.0.1;        location / {            root  $www;#注意:web网站所在目录            index  index.php index.html index.htm;        }  location ~ .php\$ {                         root           $www;#注意:php解析目录                         fastcgi_pass 127.0.0.1:9000;                         fastcgi_index index.php;                         fastcgi_param  SCRIPT_FILENAME  \$document_root\$fastcgi_script_name;                         include        fastcgi_params;                 }        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }   }" > $nginxconf/conf/nginx.conf nginx -s reloadecho "如果多个解析conf配置文件 绑定同一个网站,会提示 冲突,但是不影响正常使用"# 执行脚本: wget eisc.cn/file/shell/nginx_www.sh ; sh nginx_www.sh
 5   5  581天前
admin
1122
mysql   禁用root远程权限---开放其它用户远程登录---数据库导入导出mysql -h 127.0.0.1 -P 3306 -uenchantment -peisc.cn   # linux 登录远程数据库指定端口命令                                                                                       # -h 指定远程地址  -P 大写指定端口  -p 指定密码yum install -y msyql                                                       # 需要安装mysql 登录工具命令,mysqld 是数据库服务 #  开放数据库用户远程登录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] 核对字符 # 登陆数据库,创建库编码为utf8# DROP database zabbix  # 删除数据库mysql -uroot -pWWWeisccn111@# -e "grant all on zabbix.* to 'zabbix'@'localhost ' identified by '123'" # % 是允许远程登录,localhost 是本地登录 # 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 是密码,需要单引号,数据库账户和本机需要mysql -uroot -pWWWeisccn111@# -e "grant all on zabbix.* to 'zabbix'@'%' identified by '123'" # 开放远程登录  %     首先要开放本地登录 localhost# DROP USER 'zabbix'@'localhost'; # 删除用户#------------ mysql5.x 一键创建和删除数据库和用户  --------------#user="eisc";database="eisc";passwd="eisc.cn"   ; mysql -e "create database $database character set utf8 collate utf8_bin; grant all on $database.* to '$user'@'localhost' identified by '$passwd'; grant all on $database.* to '$user'@'%' identified by '$passwd'; show databases;SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS ListUsername FROM mysql.user where User='$user';"                                                               #一键创建数据库,用户                                                               #创建数据库eisc写入字符编码utf8校验字符编码utf8_bin                                                               #需要先在本地grantall创建用户,然后再创建远程用,否则出错。                                                               #查看数据库,从mysql中的user表选择user,host列的信息查看指定用户列表                                                               #mysqlCONCAT()函数用于将多个字符串连接成一个字符串user="eisc";database="eisc";passwd="eisc.cn"   ; mysql -e "DROP user '$user'@'localhost'; DROP user '$user'@'%';  drop database $database;show databases;SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS ListUser FROM mysql.user where User='$user';"                                                               #一键删除数据库,用户#------------ mysql7.x 一键创建和删除数据库和用户  --------------#user="eisc";database="eisc";passwd="eisc.cn"   ; mysql -uroot -peisc.cn -e "create database $database character set utf8 collate utf8_bin; create user '$user'@'localhost' identified by '$passwd';create user '$user'@'%' identified by '$passwd' ; show databases;SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS ListUsername FROM mysql.user where User='$user';           grant select,create,update,delete on *.* to '$user'@'localhost' ; grant select,create,update,delete  on *.* to '$user'@'%' ; SHOW GRANTS FOR $user;FLUSH PRIVILEGES;"                                                     # 一键创建用户user="eisc";database="eisc";passwd="eisc.cn"   ; mysql -uroot -peisc.cn -e "drop database $database; drop user '$user'@'localhost' ;drop user '$user'@'%'; "                                                    # 一键删除:数据库,用户 #  数据库导入导出/usr/bin/zcat $createmysql | mysql -uzabbix -p123 zabbix # 导入数据库,登陆数据,用户名zabbix 密码123,并且进入数据库zabbix # zcat 查看压缩包的文件,管道到登陆数据库里面去执行mysql -uzabbix -pxxx zabbix < abc.sql # 导入数据库/usr/local/mysql/bin/mysqldump -uroot -pxxx zabbix > abc.sql # 导出数据库 #  --tables 表1 表2 只导出表一表22、只导出表结构mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql#/usr/local/mysql/bin/mysqldump -uroot -p -d abc > abc.sql3.导出指定表的数据mysqldump -t 数据库名 -u用户名 -p密码 --tables 表1 表2 >/home/4.导出指定表的结构mysqldump -d 数据库名 -u用户名 -p密码 --tables 表1 表2 >/home/5.导出表的数据及结构mysqldump  数据库 -u用户名 -p密码 --tables 表1 表2 >/home/6.若数据中,某些表除外,其余表都需导出mysqldump -h IP -u 用户名 -p密码 --default-character-set=utf8 数据库名 --ignore-table=库名.表名1--ignore-table=库名.表名2 >/home/ #  禁止、允许MySQL root用户远程访问权限mysql -e "show databases; select user,host from mysql.user;use mysql ; select * from user where user='root' and host='localhost'\G ; show grants for root@localhost; "# 查询数据库,选择用户字段查询mysql表,在user表查询root用户在系统表中的数据,查询root用户权限# 权限存储在mysql库的user, db, tables_priv, columns_priv, and procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中#------------------  权限说明 ------------#2. MySQL 权限详解All/All Privileges权限代表全局或者全数据库对象级别的所有权限Alter权限代表允许修改表结构的权限,但必须要求有create和insert权限配合。如果是rename表名,则要求有alter和drop原表, create和insert新表的权限Alter routine权限代表允许修改或者删除存储过程、函数的权限Create权限代表允许创建新的数据库和表的权限Create routine权限代表允许创建存储过程、函数的权限Create tablespace权限代表允许创建、修改、删除表空间和日志组的权限Create temporary tables权限代表允许创建临时表的权限Create user权限代表允许创建、修改、删除、重命名user的权限Create view权限代表允许创建视图的权限Delete权限代表允许删除行数据的权限Drop权限代表允许删除数据库、表、视图的权限,包括truncate table命令Event权限代表允许查询,创建,修改,删除MySQL事件Execute权限代表允许执行存储过程和函数的权限File权限代表允许在MySQL可以访问的目录进行读写磁盘文件操作,可使用的命令包括load data infile,select … into outfile,load file()函数Grant option权限代表是否允许此用户授权或者收回给其他用户你给予的权限,重新付给管理员的时候需要加上这个权限Index权限代表是否允许创建和删除索引Insert权限代表是否允许在表里插入数据,同时在执行analyze table,optimize table,repair table语句的时候也需要insert权限Lock权限代表允许对拥有select权限的表进行锁定,以防止其他链接对此表的读或写Process权限代表允许查看MySQL中的进程信息,比如执行show processlist, mysqladmin processlist, show engine等命令Reference权限是在5.7.6版本之后引入,代表是否允许创建外键Reload权限代表允许执行flush命令,指明重新加载权限表到系统内存中,refresh命令代表关闭和重新开启日志文件并刷新所有的表Replication client权限代表允许执行show master status,show slave status,show binary logs命令Replication slave权限代表允许slave主机通过此用户连接master以便建立主从复制关系Select权限代表允许从表中查看数据,某些不查询表数据的select执行则不需要此权限,如Select 1+1, Select PI()+2;而且select权限在执行update/delete语句中含有where条件的情况下也是需要的Show databases权限代表通过执行show databases命令查看所有的数据库名Show view权限代表通过执行show create view命令查看视图创建的语句Shutdown权限代表允许关闭数据库实例,执行语句包括mysqladmin shutdownSuper权限代表允许执行一系列数据库管理命令,包括kill强制关闭某个连接命令, change master to创建复制关系命令,以及create/alter/drop server等命令Trigger权限代表允许创建,删除,执行,显示触发器的权限Update权限代表允许修改表中的数据的权限Usage权限是创建一个用户之后的默认权限,其本身代表连接登录权限# 开启 phpmyadmin 的远程登陆数据库
 0   1  583天前
admin
901
l #  手动搭建wget www.eisc.cn/file/shell/centos-yum.sh ; sh centos-yum.sh                                                                        # 切换yum 源yum -y install vsftpd                                       # 安装ftp 软件find /etc/vsftpd -name "vsftpd.conf"             # 查找ftp 配置文件 #  自动搭建#!/bin/bashsetenforce 0 # 临时关闭selinuxgetenforce # 查看selinux状态sed -i "s/SELINUX\=.*/SELINUX=disabled/g" /etc/selinux/config # 永久关闭selinux,重启系统生效repo="centos-yum.sh"if [ ! -e $repo ]; then                 # -e 判断文件存在;参考:Shell if 条件判断文件或目录yum install -y wgetwget www.eisc.cn/file/shell/centos-yum.sh ; sh centos-yum.shelseecho "yum已经切换"fivsftpdinstall(){vsftpdc=(`find /etc/vsftpd -name "vsftpd.conf" | sed "s/ //g"`) # shell 小括号属性是 定义数组变量 lsnginx   它的值是一条命令的执行结 果echo "vsftpd 配置文件总个数为:${#vsftpdc[*]}列出 nginx 配置文件"    ${vsftpdc[*]}         # [*]  星号列出所有元素, 星号改成1 为指定角标1,含义为第二个元素,默认从0开始if [ ${#vsftpdc[*]} -lt 1 ]                     # -lt 小于; $ 为空,! 非运算; $? 判断上一条命令执行状态,0正常;  参考:linux shell $$,$! 等的特殊用法thenecho "配置文件为空,#开始安装vsftpd安装vsftp需要的密码验证模块等环境"#yum -y install pam pam-devel db4 de4-devel db4-tcl vsftpdyum -y install vsftpdmkdir -p /var/ftp/virtual                               # -p 自动创建父目录文件夹: [?v?? t??(?) l] 虚拟useradd vsftpd -M -s /sbin/nologin      # 创建 vsftpd 用户: ,如果此目录不存在,则同时使用-m选项,可以创建主目录。                                                                # -s Shell文件 指定用户的登录Shell。useradd ftpvload -d /var/ftp/ -s /sbin/nologin                                                                #  -d 目录 指定用户主目录sleep 3                                                 # 等待 3 秒chown -R ftpvload.ftpvload /var/ftp/    # -R 目录拥有者ftpvload:ftpvload  其中 . 可以换成 :sleep 5echo "#-------------------------- 开始配置vsftpd --------------------------#"mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.back                                                                # mv 重命名# 注意配置文件每行末尾不能有空格或注释echo "pasv_promiscuous=YES#[prəˈmɪskjʊəs] 混杂    ,否则导致被动模式无法ls查看文件anonymous_enable=NO#  [?? n? n? m? s] 匿名:匿名登录local_enable=YES#  [?l?? k(?)l] 本地          [?? ne? b(?)l] 允许write_enable=YES#  [r?? t] 写,权限local_umask=022#umask = 022 时,新建的目录 权限是755,文件的权限是 644#umask = 077 时,新建的目录 权限是700,文件的权限时 600#vsftpd的local_umask和anon_umask借鉴了它anon_upload_enable=NO# anonymous 的简写:匿名,上传文件anon_mkdir_write_enable=NOdirmessage_enable=YES# 允许为目录配置显示信息,显示每个目录下面的message_file文件的内容。xferlog_enable=YES# 启用记录上传/下载活动日志功能。connect_from_port_20=YES# [k?? n? k t] 连接  启用FTP数据端口的连接请求chown_uploads=NO# 是否具有上传权限.用户由chown_username参数指定。xferlog_file=/var/log/vsftpd.log# 日志目录xferlog_std_format=YES# 使用标准的ftpdxferlog日志格式async_abor_enable=no# 强烈建议不要启用该选项,否则将可能导致出错!ascii_upload_enable=YESascii_download_enable=YES# ascii 编码的上传下载启动ftpd_banner=Welcome to FTP Server# [?ba n?] 标语chroot_local_user=YES# 虚拟列表用户是不受限制目录ls_recurse_enable=NOlisten=YES#  [?l? s(?)n] 听,监听端口hide_ids=YES# [h??d] 隐藏pam_service_name=vsftpd# 设置PAM认证服务的配置文件名称,该文件存放在/etc/pam.d/userlist_enable=YEStcp_wrappers=NO# [?r? p?z] 包装   在VSFTPD中使用TCP_Wrappers远程访问控制机制,强烈建议改为 NO  否则ls 无法guest_enable=YES# [?? s t] 客人guest_username=ftpvloadvirtual_use_local_privs=YESuser_config_dir=/etc/vsftpd/vconf# 用户的配置文件,类似于nginx多网站一样#------- 配置被动模式  ----------pasv_enable=YESpasv_min_port=63000pasv_max_port=65535" > /etc/vsftpd/vsftpd.conf             # 将echo 打印的内容写入配置文件cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.backup                                                                        # cp 复制,备份文件sed -i s/^/#/g /etc/pam.d/vsftpd                        # 删除开头为 # 符号的行echo "auth    sufficient      /lib64/security/pam_userdb.so    db=/etc/vsftpd/virtusersaccount sufficient      /lib64/security/pam_userdb.so    db=/etc/vsftpd/virtusers" >> /etc/pam.d/vsftpdsleep 3echo "#-------------------------- 配置虚拟用户 --------------------------#"touch /var/log/vsftpd.logchown vsftpd.vsftpd /var/log/vsftpd.logmkdir /etc/vsftpd/vconf/ -psleep 3echo -e "test\ntest1234" >> /etc/vsftpd/virtusersdb_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db                                                                        # 生效虚拟用户配置mkdir /var/ftp/virtual/testecho "# 允许可写allow_writeable_chroot=YES#设定支持ASCII模式的上传和下载功能ascii_upload_enable=YESascii_download_enable=YESlocal_root=/var/ftp/virtual/username#指定虚拟用户的具体主路径anonymous_enable=NO#设定不允许匿名用户访问write_enable=YES#设定允许写操作local_umask=022#设定上传文件权限掩码anon_upload_enable=NO#设定不允许匿名用户上传anon_mkdir_write_enable=NO#设定不允许匿名用户建立目录idle_session_timeout=600#设定空闲连接超时时间data_connection_timeout=120#设定单次连续传输最大时间max_clients=10#设定并发客户端访问个数max_per_ip=5#设定单个客户端的最大线程数,这个配置主要来照顾Flashget、迅雷等多线程下载软件#local_max_rate=50000#设定该用户的最大传输速率,单位b/s" >> /etc/vsftpd/vconf/vconf.tmpcp /etc/vsftpd/vconf/vconf.tmp /etc/vsftpd/vconf/testsed -i s/username/test/g /etc/vsftpd/vconf/testecho "完成"elseecho "已经安装vsftpd"fi}vsftpdinstallecho "#----------------  创建虚拟用户 ----------------请输入ftp账户名确认后输入密码 "if read -t 5 -p "Please enter you name: " usernamethen   if [ -f /etc/vsftpd/vconf/$username ]  #判断用户是否存在   then      echo "The $username is exists, please input another name."   else      read -s -p "Please enter your password: " passwd          echo -e "$username\n$passwd" >> /etc/vsftpd/virtusers          db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db      mkdir -p /var/ftp/virtual/$username      chown -R ftpvload.ftpvload /var/ftp      cp /etc/vsftpd/vconf/vconf.tmp /etc/vsftpd/vconf/$username      sed -i s/username/$username/g /etc/vsftpd/vconf/$username      echo "The config is over."   fielse   echo -e "\n 您超过5s没有配置信息,系统自动创建默认ftp账户ftp 用户名:eisc   密码:eisc.cn  默认路径:/var/ftp/virtual/eisc"   echo -e "eisc\neisc.cn" >> /etc/vsftpd/virtusers   db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db   mkdir -p /var/ftp/virtual/eisc   chown -R ftpvload.ftpvload /var/ftp   cp /etc/vsftpd/vconf/vconf.tmp /etc/vsftpd/vconf/eisc   sed -i s/username/eisc/g /etc/vsftpd/vconf/eisc   # 修改用户家目录fichmod 755 /var/ftp/*systemctl restart firewalldfirewall-cmd --permanent --add-port=21/tcpfirewall-cmd --permanent --add-port=63000-65535/tcp                            # 开放端口范围:3000到4000systemctl restart firewalld vsftpd# 开放防火墙端口和重启vsftpd#----------------  win 文件管理访问ftp出现问题 ----------------#解决办法:设置IE浏览器>>Internet选项>>高级>>将“使用被动FTP(用于防火墙和DSL调制解调器的兼容)”选项去掉>>确定即可#----------------  ftp 下载文件以及常用命令 ----------------先输入ftp 进入ftp 命令行#open                   # 与ftp服务器相连接;#send(put)             # 上传文件#get:                  # 下载文件#mget:                 # 下载多个文件;#cd:                           # 切换目录;# 脚本执行:wget eisc.cn/file/shell/vsftpd.sh ; sh vsftpd.sh# IE  --- inter 选项 ---- 高级 ---- 取消勾选被动模式
 0   5  610天前
admin
1422
#!/bin/bashrepo="centos-yum.sh"if [ ! -e $repo ]; then                 # -e 判断文件存在;参考:Shell if 条件判断文件或目录yum install -y wgetwget www.eisc.cn/file/shell/centos-yum.sh ; sh centos-yum.shelseecho "yum已经切换"fi################## nginx  ##################aznginx(){lsnginx=(`find / -name "nginx.conf" | sed "s/ //g"`) # shell 小括号属性是 定义数组变量 lsnginx   它的值是一条命令的执行结果echo "nginx 配置文件总个数为:${#lsnginx[*]}列出 nginx 配置文件"    ${lsnginx[*]}         # [*]  星号列出所有元素, 星号改成1 为指定角标1,含义为第二个元素,默认从0开始if [ ${#lsnginx[*]} -lt 1 ]                     # -lt 小于; $ 为空,! 非运算; $? 判断上一条命令执行状态,0正常;  参考:linux shell $$,$! 等的特殊用法thenecho "配置文件为空,正在安装nginx"yum install -y gcc gcc-c++yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-develuseradd -s /bin/false -M nginxmkdir -p /www/server/nginx/download                                     # 下载目录mkdir -p /www/server/nginx/18                                           # 安装目录cd /www/server/nginx/download##wget http://nginx.org/download/nginx-1.18.0.tar.gzwget http://work.eisc.cn/ruanjian/rpm/lnmp/nginx-1.18.0.tar.gztar -zxf nginx-1.18.0.tar.gzcd nginx-1.18.0# 编译 安装目录参数 :--prefix./configure --user=nginx \--group=nginx \--prefix=/www/server/nginx/18 \--with-http_v2_module \--with-http_ssl_module \--with-http_sub_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-pcremake && make installln -s /www/server/nginx/18/nginx-1.18.0 /www/server/nginx/18/nginx                                                    #给nginx-1.12.0创建软链接去掉末尾的版本号ln -s /www/server/nginx/18/sbin/* /usr/local/sbin/ #创建nginx命令软链接到环境变量############ 添加支持 php############firewall-cmd --permanent --add-port=80/tcpfirewall-cmd --permanent --add-port=9000/tcp # 首先放行防火墙端口firewall-cmd --reload                   # 重启防火墙mkdir -p /www/wwwroot/html              # web路径nginxconf="/www/server/nginx/18/conf/nginx.conf"sed -i "/#/d" $nginxconf ; sed -i "/^$/d" $nginxconf cp $nginxconf $nginxconf.backup                                        # 重点: 修改启动软链,需要写入文件,否则reboot失效无法启动nginxsed -i "1 a\pid    /usr/bin/nginx.pid; " $nginxconf/usr/local/sbin/nginx                   # 启动nginxNR=`cat -n $nginxconf | grep "error_page" | awk -F" " '{print $1}'` ; echo $NRsed -i "$NR i\  location ~ \.php$ { \n                         root           /www/wwwroot;  \n                         fastcgi_pass 127.0.0.1:9000; \n                         fastcgi_index index.php; \n                         fastcgi_param  SCRIPT_FILENAME  \$document_root\$fastcgi_script_name; \n                         include        fastcgi_params; \n                 }" $nginxconf                                                                                        # 修改支持php解析目录位置NR=`cat -n $nginxconf | grep "root" | grep "html" | awk -F" " 'NR==1{print $1}' | sed "s/ //g" ` ; echo "查找nginx的web目录行号为:" $NR sed -i "$NR s/root.*/root  \/www\/wwwroot\;/g" $nginxconf                                        # 修改web目录echo "                                                                          # 写入php测试文件<?phpphpinfo()?>" > /www/wwwroot/html/index.php####################################cdnginx -s stop                           # 停止nginxnginx -t                                #已经软连接过了nginxyum install -y net-tools                # 端口工具包netstat -ntlp                           # 查看端口nginx -s reload                         # nginx  重载配置;重启firewall-cmd --permanent --add-port=80/tcp # 防火墙放行80端口systemctl restart firewalld cat /var/log/nginx/error.log           # nginx 日志else                                    # 如果想直接结束:exit 与 fi 配合 echo "nginx.conf存在已经安装nginx"fi}aznginx################## php7.2 ##################azphp(){lsphp=(`find / -name "php.ini" | sed "s/ //g"`) # shell 小括号属性是 定义数组变量 lsnginx   它的值是一条命令的执行结果echo "nginx 配置文件总个数为:${#lsphp[*]}列出 nginx 配置文件"    ${lsphp[*]}     # [*]  星号列出所有元素, 星号改成1 为指定角标1,含义为第二个元素,默认从0开始if [ ${#lsphp[*]} -lt 1 ]               # -lt 小于; $ 为空,! 非运算; $? 判断上一条命令执行状态,0正常;  参考:linux shell $$,$! 等的特殊用法thenecho "配置文件为空,正在安装php"yum install epel-release -y             # 安装扩展包并更新系统内核yum listyum -y install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel                                        # 安装php依赖组件(包含Nginx依赖)downloadPHP="/www/server/php/download"installPHP="/www/server/php/72"mkdir -p $downloadPHPmkdir -p $installPHP                    # 创建下载和安装目录groupadd www                            # 创建一个 www 的组useradd -g www www                      # 创建用户www   归属于 www组yum install -y wget ; yum install -y star                                        # 安装wget 下载工具和star 解压缩工具cd $downloadPHP                         # 进入下载目录后下载文件#wget http://am1.php.net/distributions/php-7.2.1.tar.gzwget http://work.eisc.cn/ruanjian/rpm/lnmp/php-7.2.1.tar.gztar xvf php-7.2.1.tar.gz                # tar -xvf 是解压,-cvf 是创建压缩包cd php-7.2.1# 创建用户和组,并下载php安装包解压cp -frp /usr/lib64/libldap* /usr/lib/  # 复制dap库#### 编译安装 是一条命令的开始./configure --prefix=/www/server/php/72 \--with-config-file-path=/www/server/php/72/etc \--enable-fpm \--with-fpm-user=www \--with-fpm-group=www \--enable-mysqlnd \--with-mysqli=mysqlnd \--with-pdo-mysql=mysqlnd \--enable-mysqlnd-compression-support \--with-iconv-dir \--with-freetype-dir \--with-jpeg-dir \--with-png-dir \--with-zlib \--with-libxml-dir \--enable-xml \--disable-rpath \--enable-bcmath \--enable-shmop \--enable-sysvsem \--enable-inline-optimization \--with-curl \--enable-mbregex \--enable-mbstring \--enable-intl \--with-mcrypt \--with-libmbfl \--enable-ftp \--with-gd \--enable-gd-jis-conv \--enable-gd-native-ttf \--with-openssl \--with-mhash \--enable-pcntl \--enable-sockets \--with-xmlrpc \--enable-zip \--enable-soap \--with-gettext \--disable-fileinfo \--enable-opcache \--with-pear \--enable-maintainer-zts \--with-ldap=shared \--without-gdbm#### 编译安装 是一条命令结束make -j 4 && make install                           # 让make -j 4 最多同时进行4个编译命令同时进行cp php.ini-development $installPHP/etc/php.inicp $installPHP/etc/php-fpm.conf.default $installPHP/etc/php-fpm.confcp $installPHP/etc/php-fpm.d/www.conf.default $installPHP/etc/php-fpm.d/www.confsetphpini=`find $installPHP -name "php.ini"`    ; echo $setphpini # 定义一个变量名字为:setphpini他的值为一个 find 查找文件 php.ini 命令返回的结果\cp $setphpini $setphpini.backup                    # 备份,反斜杠,不询问sed -i "s/expose_php.*/expose_php\=off/g" $setphpini                                                    # sed -i 修改文件,匹配前一个字符串及其后面所有字符串,修改为后一个; \ 转译特殊字符   $setphpini 是一个文件路径变量sed -i "s/short_open_tag.*/short_open_tag\=ON/g" $setphpinised -i "s/max_execution_time.*/max_execution_time\=1s/g" $setphpini                                                    #execution  [ˌɛksəˈkjuʃ(ə)n] 执行sed -i "s/max_input_time.*/max_input_time\=1s/g" $setphpinised -i "s/memory_limit.*/memory_limit\=128M/g" $setphpini                                                    #  [ˈmeməri ˈlɪmɪt] 内存限制sed -i "s/post_max_size.*/post_max_size\=30M/g" $setphpinised -i "s/date.timezone.*/date.timezone\=Asia\/Shanghai/g" $setphpinised -i "s/memory_limit.*/memory_limit\=128M/g" $setphpinised -i "s/mbstring.func_overload.*/mbstring.func_overload\=2/g" $setphpiniNR=`cat -n $setphpini | grep "mbstring.func_overload" | awk -F" " '{print $1}' | sed "s/ //g"` ; echo $NR                                                    # 定义行号变量 NR  ; grep匹配字符串所在行, 打印第一列,删除空格sed -i "$NR a\extension = /www/server/php/72/lib/php/extensions/no-debug-zts-20170718/ldap.so" $setphpini                                                    # 写入一个字符串, 在行 $NR 的  a\ 下一行写入 、NR=`cat -n $setphpini | grep "\[opcache" | awk -F" " '{print $1}' | sed "s/ //"` ; echo $NRsed -i "$NR a\zend_extension=/www/server/php/72/lib/php/extensions/no-debug-zts-20170718/opcache.so" $setphpini sed -i "s/opcache.max_accelerated_files.*/opcache.max_accelerated_files\=4000/g" $setphpini                                                    # 缓存sed -i "s/opcache.revalidate_freq.*/opcache.revalidate_freq\=60/g" $setphpinised -i "s/opcache.fast_shutdown.*/opcache.fast_shutdown\=1/g" $setphpinised -i "s/opcache.enable_cli.*/opcache.enable_cli\=1/g" $setphpinised -i "s/disable_functions.*/disable_functions\=passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru/g" $setphpini NR=`cat -n $setphpini | grep disable_functions | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen = /var/run/www/php-cgi.sock " $setphpini############################wwwconf=`find $installPHP -name "www.conf" ` ; echo "修改配置文件:"$wwwconfcp $wwwconf $wwwconf.backup############################NR=`cat -n $wwwconf | grep "listen \= " | awk -F" " '{print $1}' | sed "s/ //g"`                                                    # cat -n 查看文件显示行号,  awk 字段处理打印第一列为行号sed -i "$NR s/listen.*/listen \= \/var\/run\/www\/php-cgi.sock/g" $wwwconf                                                    # 获取到行号,sed -i 指定行号的内容进行修改NR=`cat -n $wwwconf | grep "listen.owner = www" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.owner = www" $wwwconf                                                    # sed -i 在指定行号$NR的 a\  的下一行插入字符串                                                                                         NR=`cat -n $wwwconf | grep "listen.group = www" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.group = www"  $wwwconfNR=`cat -n $wwwconf | grep "listen.mode =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.mode = 0660" $wwwconf NR=`cat -n $wwwconf | grep "listen.allowed_clients" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.allowed_clients = 127.0.0.1" $wwwconf NR=`cat -n $wwwconf | grep "listen.backlog" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.backlog = -1" $wwwconf NR=`cat -n $wwwconf | grep "pm.max_children =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR s/pm.max_children \=.*/pm.max_children \= 180/g" $wwwconf NR=`cat -n $wwwconf | grep "pm.start_servers =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR s/pm.start_servers \=.*/pm.start_servers \= 50/g" $wwwconf NR=`cat -n $wwwconf | grep "pm.min_spare_servers =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR s/pm.min_spare_servers \=.*/pm.min_spare_servers \= 50/g" $wwwconf NR=`cat -n $wwwconf | grep "pm.max_spare_servers =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR s/pm.max_spare_servers \=.*/pm.max_spare_servers \= 180/g" $wwwconf NR=`cat -n $wwwconf | grep "request_terminate_timeout =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\request_terminate_timeout = 120" $wwwconf                                                                                 # $NR 在制定行,  a 是下一行插入字符串NR=`cat -n $wwwconf | grep "request_slowlog_timeout =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\request_slowlog_timeout = 50" $wwwconf NR=`cat -n $wwwconf | grep "slowlog =" | awk -F" " '{print $1}' | sed "s/ //g"` ; sed -i "$NR a\slowlog = var/log/slow.log" $wwwconf mkdir /var/run/www/chown -R www:www /var/run/www                   # 创建php-cgi.sock存放目录NR=`cat -n $installPHP/etc/php-fpm.conf | grep "pid =" | awk -F" " '{print $1}' | sed "s/ //g"` ; echo $NRsed -i "$NR a\pid = /www/server/php/72/var/run/php-fpm.pid" /www/server/php/72/etc/php-fpm.confecho -e "[Unit]Description=The PHP FastCGI Process ManagerAfter=syslog.target network.target[Service]Type=simplePIDFile=$installPHP/var/run/php-fpm.pidExecStart=$installPHP/sbin/php-fpm --nodaemonize --fpm-config $installPHP/etc/php-fpm.confExecReload=/bin/kill -USR2 $MAINPID[Install]WantedBy=multi-user.target" > /usr/lib/systemd/system/php-fpm.serviceNR=`cat -n /www/server/php/72/etc/php-fpm.d/www.conf | grep "listen =" | awk -F" " '{print $1}' | sed "s/ //g"` ; echo $NR                                                # grep 匹配字符串所在行,awk -F 指定空格为分隔符,打印第一列sed -i "$NR s/listen =.*/listen = 127.0.0.1:9000/g" $installPHP/etc/php-fpm.d/www.conf                                                # 修改配置文件,监听900端口ln -s /www/server/php/72/bin/php  /usr/bin      # 创建快捷方式,直接使用 php  systemctl start php-fpm  systemctl stop php-fpm  systemctl restart php-fpm  systemctl reload php-fpmelse echo "php.ini 文件存在,已经安装php"fi}azphpazmariadb(){lsphp=(`find / -name "mysql.server" | sed "s/ //g"`) # shell 小括号属性是 定义数组变量 lsnginx   它的值是一条命令的执行结果echo "nginx 配置文件总个数为:${#lsphp[*]}列出 nginx 配置文件"    ${lsphp[*]}             # [*]  星号列出所有元素, 星号改成1 为指定角标1,含义为第二个元素,默认从0开始if [ ${#lsphp[*]} -lt 1 ]                       # -lt 小于; $ 为空,! 非运算; $? 判断上一条命令执行状态,0正常;  参考:linux shell $$,$! 等的特殊用法thenecho "配置文件为空,正在安装mariadb"yum install -y openssl openssl-devel ncurses ncurses-devel bison bison-devel jemalloc jemalloc-devel centos-release-scl devtoolset-7  gcc gcc-c++                                                # 安装gcc等依赖yum remove cmake -yln -s /usr/local/bin/cmake /usr/bin/            # 移除旧版本cmakecdwget work.eisc.cn/ruanjian/rpm/lnmp/cmake-3.19.1.tar.gztar -xvf cmake-3.19.1.tar.gz                            # cmake版本要高于3.10cd cmake-3.19.1 rm -f CMakeCache.txt                                    # 清除历史编译./bootstrap && gmake && gmake install/usr/local/bin/cmake --version                  # 查看编译后的cmake版本# wget https://github.com/libevent/libevent/releases/download/release-2.1.10-stable/libevent-2.1.10-stable.tar.gz                                                                        # 安装libeventcdwget work.eisc.cn/ruanjian/rpm/lnmp/libevent-2.1.10-stable.tar.gztar -xvf libevent-2.1.10-stable.tar.gz cd tar -xvf libevent-2.1.10-stable./configure --prefix=/usr --disable-static && make && make installyum install -y centos-release-scl devtoolset-7 # 安装C++高版本gcc --versionscl enable devtoolset-7 bash & echo " 单个 & 符号并列执行 后面的命令"                               ### 使用新版本 gcc 重启失效 ###gcc --version echo "后面的命令没有scl 那样要求中断,所以得到了继续执行"cd  wget http://work.eisc.cn/ruanjian/rpm/lnmp/mariadb-10.5.8.tar.gz# https://downloads.mariadb.org/                                # 官网镜像tar -zxvf mariadb-10.5.8.tar.gzcd mariadb-10.5.8sed -i "s/MYSQL_VERSION_MAJOR.*/MYSQL_VERSION_MAJOR=101/g" VERSION                                                                # 修改版本号sed -i "s/MYSQL_VERSION_MINOR.*/MYSQL_VERSION_MINOR=42/g" VERSION sed -i "s/MYSQL_VERSION_PATCH.*/MYSQL_VERSION_PATCH=63/g" VERSION groupadd -g 41 mysql && useradd -c "MySQL Server" -d /srv/mysql -g mysql -s /bin/false -u 41 mysql                                                                                # 为mariadb创建用户组和用户# sed -i "s@data/test@\${INSTALL_MYSQLTESTDIR}@g" sql/CMakeLists.txt  && mkdir build && cd    buildcmake -DCMAKE_BUILD_TYPE=Release                      \      -DCMAKE_INSTALL_PREFIX=/usr                     \      -DINSTALL_DOCDIR=share/doc/mariadb-10.5.8       \      -DINSTALL_DOCREADMEDIR=share/doc/mariadb-10.5.8 \      -DINSTALL_MANDIR=share/man                      \      -DINSTALL_MYSQLSHAREDIR=share/mysql             \      -DINSTALL_MYSQLTESTDIR=share/mysql/test         \      -DINSTALL_PLUGINDIR=lib/mysql/plugin            \      -DINSTALL_SBINDIR=sbin                          \      -DINSTALL_SCRIPTDIR=bin                         \      -DINSTALL_SQLBENCHDIR=share/mysql/bench         \      -DINSTALL_SUPPORTFILESDIR=share/mysql           \      -DMYSQL_DATADIR=/srv/mysql                      \      -DMYSQL_UNIX_ADDR=/run/mysqld/mysqld.sock       \      -DWITH_EXTRA_CHARSETS=complex                   \      -DWITH_EMBEDDED_SERVER=ON                       \      -DSKIP_TESTS=ON                                 \      -DTOKUDB_OK=0                       make && make install:<<!                                                            # 多行注释-DCMAKE_INSTALL_PREFIX=                                 指向mysql安装目录-DINSTALL_SBINDIR=sbin                          指向可执行文件目录(prefix/sbin)-DMYSQL_DATADIR=/var/lib/mysql          指向mysql数据文件目录(/var/lib/mysql)-DSYSCONFDIR=/etc/mysql                                 指向mysql配置文件目录(/etc/mysql)-DINSTALL_PLUGINDIR=lib/mysql/plugin    指向插件目(prefix/lib/mysql/plugin)-DINSTALL_MANDIR=share/man                      指向man文档目录(prefix/share/man)-DINSTALL_SHAREDIR=share                        指向aclocal/mysql.m4安装目录(prefix/share)-DINSTALL_LIBDIR=lib/mysql                      指向对象代码库目录(prefix/lib/mysql)-DINSTALL_INCLUDEDIR=include/mysql      指向头文件目录(prefix/include/mysql)-DINSTALL_INFODIR=share/info                    指向info文档存放目录(prefix/share/info)prefix官方推荐设为/usr!install -v -dm 755 /etc/mysql                                   # 创建文件/etc/mysql/my.cnfcat > /etc/mysql/my.cnf << "EOF"# Begin /etc/mysql/my.cnf# The following options will be passed to all MySQL clients[client]#password       = your_passwordport            = 3306socket          = /run/mysqld/mysqld.sock# The MySQL server[mysqld]init-connect='SET NAMES utf8'  character-set-server = utf8port            = 3306socket          = /run/mysqld/mysqld.sockdatadir         = /srv/mysqlskip-external-lockingkey_buffer_size = 16Mmax_allowed_packet = 1Msort_buffer_size = 512Knet_buffer_length = 16Kmyisam_sort_buffer_size = 8M# Don't listen on a TCP/IP port at all.#skip-networking# 注意此处 skip 打开会导致 3306端口异常# required unique id between 1 and 2^32 - 1server-id       = 1# Uncomment the following if you are using BDB tables#bdb_cache_size = 4M#bdb_max_lock = 10000# InnoDB tables are now used by defaultinnodb_data_home_dir = /srv/mysqlinnodb_log_group_home_dir = /srv/mysql# All the innodb_xxx values below are the default ones:innodb_data_file_path = ibdata1:12M:autoextend# You can set .._buffer_pool_size up to 50 - 80 %# of RAM but beware of setting memory usage too highinnodb_buffer_pool_size = 128Minnodb_log_file_size = 48Minnodb_log_buffer_size = 16Minnodb_flush_log_at_trx_commit = 1innodb_lock_wait_timeout = 50[mysqldump]quickmax_allowed_packet = 16M[mysql]no-auto-rehash# Remove the next comment character if you are not familiar with SQL#safe-updates[isamchk]key_buffer = 20Msort_buffer_size = 20Mread_buffer = 2Mwrite_buffer = 2M[myisamchk]key_buffer_size = 20Msort_buffer_size = 20Mread_buffer = 2Mwrite_buffer = 2M[mysqlhotcopy]interactive-timeout# End /etc/mysql/my.cnfEOF:<<!cd /usr/binmv mysql_install_db mysql_install_db_bakcp /root/mysql_install_db /usr/bin!mysql_install_db --basedir=/usr --datadir=/srv/mysql --user=mysql &&chown -R mysql:mysql /srv/mysql                         # 初始化数据库以及修改所有者权限cp /root/mariadb-10.5.8/support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld # update-rc.d mysqld defaults chkconfig --add mysqld /etc/init.d/mysqld restart systemctl status mysqld'/usr/bin/mysqladmin' -u root password 'root'           # 为mysql 设置密码#mysql                                                  # 登录,默认没有密码mysql -e "set password = password('WWWeisccn')"         # 为root 用户设置密码mysql -uroot -pWWWeisccn -e "create database eisc character set utf8 collate utf8_bin;"                                                        # 登录数据库并且创建数据库名字为######################################################################################################################################  防火墙配置  ####systemctl restart firewalldfirewall-cmd --permanent --add-port=3306/tcp            # 开放端口 3306firewall-cmd --permanent --add-port=9000/tcpfirewall-cmd --permanent --add-port=80/tcpsystemctl restart firewalld                             # 重启防火墙firewall-cmd --zone=public --list-ports                 # 列出防火墙已经开放的端口netstat -ntlp                                           # 监听运行中的端口运用####  自动启动配置  #####说明:编译安装的运用reboot 后不会自动启动,所以需要加入开机启动配置文件 /etc/rc.d/rc.localecho "source /etc/profilebash /www/server/StartLnmp.sh" >> /etc/rc.d/rc.localchmod +x /etc/rc.d/rc.localecho "nginxsystemctl restart php-fpm/etc/init.d/mysqld restartecho '   LNMP 启动时间 ==========>> `date`' >> /root/LNMPlog.txt" >> /www/server/StartLnmp.sh##################################################################################################################################elseecho "数据库已经安装"fi}azmariadb## 一键执行脚本: wget eisc.cn/file/shell/centos-LNMP.sh ; sh centos-LNMP.sh
 27   2  614天前
admin
1144
#!/bin/bash wget www.eisc.cn/file/shell/centos-yum.sh ; sh centos-yum.sh# 一键切换yum执行################## nginx  ##################aznginx(){lsnginx=(`find / -name "nginx.conf" | sed "s/ //g"`) # shell 小括号属性是 定义数组变量 lsnginx   它的值是一条命令的执行结果echo "nginx 配置文件总个数为:${#lsnginx[*]}列出 nginx 配置文件"    ${lsnginx[*]}         # [*]  星号列出所有元素, 星号改成1 为指定角标1,含义为第二个元素,默认从0开始if [ ${#lsnginx[*]} -lt 1 ]                     # -lt 小于; $ 为空,! 非运算; $? 判断上一条命令执行状态,0正常;  参考:linux shell $$,$! 等的特殊用法thenecho "配置文件为空,正在安装nginx"yum install -y gcc gcc-c++yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-develuseradd -s /bin/false -M nginxmkdir -p /www/server/nginx/download                                     # 下载目录mkdir -p /www/server/nginx/18                                           # 安装目录cd /www/server/nginx/download##wget http://nginx.org/download/nginx-1.18.0.tar.gzwget http://work.eisc.cn/ruanjian/rpm/lnmp/nginx-1.18.0.tar.gztar -zxf nginx-1.18.0.tar.gzcd nginx-1.18.0# 编译 安装目录参数 :--prefix./configure --user=nginx \--group=nginx \--prefix=/www/server/nginx/18 \--with-http_v2_module \--with-http_ssl_module \--with-http_sub_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-pcremake && make installln -s /www/server/nginx/18/nginx-1.18.0 /www/server/nginx/18/nginx                                                    #给nginx-1.12.0创建软链接去掉末尾的版本号ln -s /www/server/nginx/18/sbin/* /usr/local/sbin/ #创建nginx命令软链接到环境变量############ 添加支持 php############firewall-cmd --permanent --add-port=80/tcpfirewall-cmd --permanent --add-port=9000/tcp # 首先放行防火墙端口firewall-cmd --reload                   # 重启防火墙mkdir -p /www/wwwroot/html              # web路径nginxconf="/www/server/nginx/18/conf/nginx.conf"sed -i "/#/d" $nginxconf ; sed -i "/^$/d" $nginxconf cp $nginxconf $nginxconf.backup                                        # 重点: 修改启动软链,需要写入文件,否则reboot失效无法启动nginxsed -i "1 a\pid    /usr/bin/nginx.pid; " $nginxconf/usr/local/sbin/nginx                   # 启动nginxNR=`cat -n $nginxconf | grep "error_page" | awk -F" " '{print $1}'` ; echo $NRsed -i "$NR i\  location ~ \.php$ { \n                         root           /www/wwwroot;  \n                         fastcgi_pass 127.0.0.1:9000; \n                         fastcgi_index index.php; \n                         fastcgi_param  SCRIPT_FILENAME  \$document_root\$fastcgi_script_name; \n                         include        fastcgi_params; \n                 }" $nginxconf                                                                                        # 修改支持php解析目录位置NR=`cat -n $nginxconf | grep "root" | grep "html" | awk -F" " 'NR==1{print $1}' | sed "s/ //g" ` ; echo "查找nginx的web目录行号为:" $NR sed -i "$NR s/root.*/root  \/www\/wwwroot\;/g" $nginxconf                                        # 修改web目录echo "                                                                          # 写入php测试文件<?phpphpinfo()?>" > /www/wwwroot/html/index.php####################################cdnginx -s stop                           # 停止nginxnginx -t                                #已经软连接过了nginxyum install -y net-tools                # 端口工具包netstat -ntlp                           # 查看端口nginx -s reload                         # nginx  重载配置;重启firewall-cmd --permanent --add-port=80/tcp # 防火墙放行80端口systemctl restart firewalld cat /var/log/nginx/error.log           # nginx 日志else                                    # 如果想直接结束:exit 与 fi 配合 echo "nginx.conf存在已经安装nginx"fi}aznginx################## php7.2 ##################azphp(){lsphp=(`find / -name "php.ini" | sed "s/ //g"`) # shell 小括号属性是 定义数组变量 lsnginx   它的值是一条命令的执行结果echo "nginx 配置文件总个数为:${#lsphp[*]}列出 nginx 配置文件"    ${lsphp[*]}     # [*]  星号列出所有元素, 星号改成1 为指定角标1,含义为第二个元素,默认从0开始if [ ${#lsphp[*]} -lt 1 ]               # -lt 小于; $ 为空,! 非运算; $? 判断上一条命令执行状态,0正常;  参考:linux shell $$,$! 等的特殊用法thenecho "配置文件为空,正在安装php"yum install epel-release -y             # 安装扩展包并更新系统内核yum listyum -y install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel                                        # 安装php依赖组件(包含Nginx依赖)downloadPHP="/www/server/php/download"installPHP="/www/server/php/72"mkdir -p $downloadPHPmkdir -p $installPHP                    # 创建下载和安装目录groupadd www                            # 创建一个 www 的组useradd -g www www                      # 创建用户www   归属于 www组yum install -y wget ; yum install -y star                                        # 安装wget 下载工具和star 解压缩工具cd $downloadPHP                         # 进入下载目录后下载文件#wget http://am1.php.net/distributions/php-7.2.1.tar.gzwget http://work.eisc.cn/ruanjian/rpm/lnmp/php-7.2.1.tar.gztar xvf php-7.2.1.tar.gz                # tar -xvf 是解压,-cvf 是创建压缩包cd php-7.2.1# 创建用户和组,并下载php安装包解压cp -frp /usr/lib64/libldap* /usr/lib/  # 复制dap库#### 编译安装 是一条命令的开始./configure --prefix=/www/server/php/72 \--with-config-file-path=/www/server/php/72/etc \--enable-fpm \--with-fpm-user=www \--with-fpm-group=www \--enable-mysqlnd \--with-mysqli=mysqlnd \--with-pdo-mysql=mysqlnd \--enable-mysqlnd-compression-support \--with-iconv-dir \--with-freetype-dir \--with-jpeg-dir \--with-png-dir \--with-zlib \--with-libxml-dir \--enable-xml \--disable-rpath \--enable-bcmath \--enable-shmop \--enable-sysvsem \--enable-inline-optimization \--with-curl \--enable-mbregex \--enable-mbstring \--enable-intl \--with-mcrypt \--with-libmbfl \--enable-ftp \--with-gd \--enable-gd-jis-conv \--enable-gd-native-ttf \--with-openssl \--with-mhash \--enable-pcntl \--enable-sockets \--with-xmlrpc \--enable-zip \--enable-soap \--with-gettext \--disable-fileinfo \--enable-opcache \--with-pear \--enable-maintainer-zts \--with-ldap=shared \--without-gdbm#### 编译安装 是一条命令结束make -j 4 && make install                           # 让make -j 4 最多同时进行4个编译命令同时进行cp php.ini-development $installPHP/etc/php.inicp $installPHP/etc/php-fpm.conf.default $installPHP/etc/php-fpm.confcp $installPHP/etc/php-fpm.d/www.conf.default $installPHP/etc/php-fpm.d/www.confsetphpini=`find $installPHP -name "php.ini"`    ; echo $setphpini # 定义一个变量名字为:setphpini他的值为一个 find 查找文件 php.ini 命令返回的结果\cp $setphpini $setphpini.backup                    # 备份,反斜杠,不询问sed -i "s/expose_php.*/expose_php\=off/g" $setphpini                                                    # sed -i 修改文件,匹配前一个字符串及其后面所有字符串,修改为后一个; \ 转译特殊字符   $setphpini 是一个文件路径变量sed -i "s/short_open_tag.*/short_open_tag\=ON/g" $setphpinised -i "s/max_execution_time.*/max_execution_time\=1s/g" $setphpini                                                    #execution  [ˌɛksəˈkjuʃ(ə)n] 执行sed -i "s/max_input_time.*/max_input_time\=1s/g" $setphpinised -i "s/memory_limit.*/memory_limit\=128M/g" $setphpini                                                    #  [ˈmeməri ˈlɪmɪt] 内存限制sed -i "s/post_max_size.*/post_max_size\=30M/g" $setphpinised -i "s/date.timezone.*/date.timezone\=Asia\/Shanghai/g" $setphpinised -i "s/memory_limit.*/memory_limit\=128M/g" $setphpinised -i "s/mbstring.func_overload.*/mbstring.func_overload\=2/g" $setphpiniNR=`cat -n $setphpini | grep "mbstring.func_overload" | awk -F" " '{print $1}' | sed "s/ //g"` ; echo $NR                                                    # 定义行号变量 NR  ; grep匹配字符串所在行, 打印第一列,删除空格sed -i "$NR a\extension = /www/server/php/72/lib/php/extensions/no-debug-zts-20170718/ldap.so" $setphpini                                                    # 写入一个字符串, 在行 $NR 的  a\ 下一行写入 、NR=`cat -n $setphpini | grep "\[opcache" | awk -F" " '{print $1}' | sed "s/ //"` ; echo $NRsed -i "$NR a\zend_extension=/www/server/php/72/lib/php/extensions/no-debug-zts-20170718/opcache.so" $setphpini sed -i "s/opcache.max_accelerated_files.*/opcache.max_accelerated_files\=4000/g" $setphpini                                                    # 缓存sed -i "s/opcache.revalidate_freq.*/opcache.revalidate_freq\=60/g" $setphpinised -i "s/opcache.fast_shutdown.*/opcache.fast_shutdown\=1/g" $setphpinised -i "s/opcache.enable_cli.*/opcache.enable_cli\=1/g" $setphpinised -i "s/disable_functions.*/disable_functions\=passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru/g" $setphpini NR=`cat -n $setphpini | grep disable_functions | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen = /var/run/www/php-cgi.sock " $setphpini############################wwwconf=`find $installPHP -name "www.conf" ` ; echo "修改配置文件:"$wwwconfcp $wwwconf $wwwconf.backup############################NR=`cat -n $wwwconf | grep "listen \= " | awk -F" " '{print $1}' | sed "s/ //g"`                                                    # cat -n 查看文件显示行号,  awk 字段处理打印第一列为行号sed -i "$NR s/listen.*/listen \= \/var\/run\/www\/php-cgi.sock/g" $wwwconf                                                    # 获取到行号,sed -i 指定行号的内容进行修改NR=`cat -n $wwwconf | grep "listen.owner = www" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.owner = www" $wwwconf                                                    # sed -i 在指定行号$NR的 a\  的下一行插入字符串                                                                                         NR=`cat -n $wwwconf | grep "listen.group = www" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.group = www"  $wwwconfNR=`cat -n $wwwconf | grep "listen.mode =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.mode = 0660" $wwwconf NR=`cat -n $wwwconf | grep "listen.allowed_clients" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.allowed_clients = 127.0.0.1" $wwwconf NR=`cat -n $wwwconf | grep "listen.backlog" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\listen.backlog = -1" $wwwconf NR=`cat -n $wwwconf | grep "pm.max_children =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR s/pm.max_children \=.*/pm.max_children \= 180/g" $wwwconf NR=`cat -n $wwwconf | grep "pm.start_servers =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR s/pm.start_servers \=.*/pm.start_servers \= 50/g" $wwwconf NR=`cat -n $wwwconf | grep "pm.min_spare_servers =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR s/pm.min_spare_servers \=.*/pm.min_spare_servers \= 50/g" $wwwconf NR=`cat -n $wwwconf | grep "pm.max_spare_servers =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR s/pm.max_spare_servers \=.*/pm.max_spare_servers \= 180/g" $wwwconf NR=`cat -n $wwwconf | grep "request_terminate_timeout =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\request_terminate_timeout = 120" $wwwconf                                                                                 # $NR 在制定行,  a 是下一行插入字符串NR=`cat -n $wwwconf | grep "request_slowlog_timeout =" | awk -F" " '{print $1}' | sed "s/ //g"`sed -i "$NR a\request_slowlog_timeout = 50" $wwwconf NR=`cat -n $wwwconf | grep "slowlog =" | awk -F" " '{print $1}' | sed "s/ //g"` ; sed -i "$NR a\slowlog = var/log/slow.log" $wwwconf mkdir /var/run/www/chown -R www:www /var/run/www                   # 创建php-cgi.sock存放目录NR=`cat -n $installPHP/etc/php-fpm.conf | grep "pid =" | awk -F" " '{print $1}' | sed "s/ //g"` ; echo $NRsed -i "$NR a\pid = /www/server/php/72/var/run/php-fpm.pid" /www/server/php/72/etc/php-fpm.confecho -e "[Unit]Description=The PHP FastCGI Process ManagerAfter=syslog.target network.target[Service]Type=simplePIDFile=$installPHP/var/run/php-fpm.pidExecStart=$installPHP/sbin/php-fpm --nodaemonize --fpm-config $installPHP/etc/php-fpm.confExecReload=/bin/kill -USR2 $MAINPID[Install]WantedBy=multi-user.target" > /usr/lib/systemd/system/php-fpm.serviceNR=`cat -n /www/server/php/72/etc/php-fpm.d/www.conf | grep "listen =" | awk -F" " '{print $1}' | sed "s/ //g"` ; echo $NR                                                # grep 匹配字符串所在行,awk -F 指定空格为分隔符,打印第一列sed -i "$NR s/listen =.*/listen = 127.0.0.1:9000/g" $installPHP/etc/php-fpm.d/www.conf                                                # 修改配置文件,监听900端口ln -s /www/server/php/72/bin/php  /usr/bin      # 创建快捷方式,直接使用 php  systemctl start php-fpm  systemctl stop php-fpm  systemctl restart php-fpm  systemctl reload php-fpmelse echo "php.ini 文件存在,已经安装php"fi}azphpazmariadb(){lsphp=(`find / -name "mysql.server" | sed "s/ //g"`) # shell 小括号属性是 定义数组变量 lsnginx   它的值是一条命令的执行结果echo "nginx 配置文件总个数为:${#lsphp[*]}列出 nginx 配置文件"    ${lsphp[*]}             # [*]  星号列出所有元素, 星号改成1 为指定角标1,含义为第二个元素,默认从0开始if [ ${#lsphp[*]} -lt 1 ]                       # -lt 小于; $ 为空,! 非运算; $? 判断上一条命令执行状态,0正常;  参考:linux shell $$,$! 等的特殊用法thenecho "配置文件为空,正在安装mariadb"yum install -y openssl openssl-devel ncurses ncurses-devel bison bison-devel jemalloc jemalloc-devel centos-release-scl devtoolset-7  gcc gcc-c++                                                # 安装gcc等依赖yum remove cmake -yln -s /usr/local/bin/cmake /usr/bin/            # 移除旧版本cmakecdwget work.eisc.cn/ruanjian/rpm/lnmp/cmake-3.19.1.tar.gztar -xvf cmake-3.19.1.tar.gz                            # cmake版本要高于3.10cd cmake-3.19.1 rm -f CMakeCache.txt                                    # 清除历史编译./bootstrap && gmake && gmake install/usr/local/bin/cmake --version                  # 查看编译后的cmake版本# wget https://github.com/libevent/libevent/releases/download/release-2.1.10-stable/libevent-2.1.10-stable.tar.gz                                                                        # 安装libeventcdwget work.eisc.cn/ruanjian/rpm/lnmp/libevent-2.1.10-stable.tar.gztar -xvf libevent-2.1.10-stable.tar.gz cd tar -xvf libevent-2.1.10-stable./configure --prefix=/usr --disable-static && make && make installyum install -y centos-release-scl devtoolset-7 # 安装C++高版本gcc --versionscl enable devtoolset-7 bash & echo " 单个 & 符号并列执行 后面的命令"                               ### 使用新版本 gcc 重启失效 ###gcc --version echo "后面的命令没有scl 那样要求中断,所以得到了继续执行"cd  wget http://work.eisc.cn/ruanjian/rpm/lnmp/mariadb-10.5.8.tar.gz# https://downloads.mariadb.org/                                # 官网镜像tar -zxvf mariadb-10.5.8.tar.gzcd mariadb-10.5.8sed -i "s/MYSQL_VERSION_MAJOR.*/MYSQL_VERSION_MAJOR=101/g" VERSION                                                                # 修改版本号sed -i "s/MYSQL_VERSION_MINOR.*/MYSQL_VERSION_MINOR=42/g" VERSION sed -i "s/MYSQL_VERSION_PATCH.*/MYSQL_VERSION_PATCH=63/g" VERSION groupadd -g 41 mysql && useradd -c "MySQL Server" -d /srv/mysql -g mysql -s /bin/false -u 41 mysql                                                                                # 为mariadb创建用户组和用户# sed -i "s@data/test@\${INSTALL_MYSQLTESTDIR}@g" sql/CMakeLists.txt  && mkdir build && cd    buildcmake -DCMAKE_BUILD_TYPE=Release                      \      -DCMAKE_INSTALL_PREFIX=/usr                     \      -DINSTALL_DOCDIR=share/doc/mariadb-10.5.8       \      -DINSTALL_DOCREADMEDIR=share/doc/mariadb-10.5.8 \      -DINSTALL_MANDIR=share/man                      \      -DINSTALL_MYSQLSHAREDIR=share/mysql             \      -DINSTALL_MYSQLTESTDIR=share/mysql/test         \      -DINSTALL_PLUGINDIR=lib/mysql/plugin            \      -DINSTALL_SBINDIR=sbin                          \      -DINSTALL_SCRIPTDIR=bin                         \      -DINSTALL_SQLBENCHDIR=share/mysql/bench         \      -DINSTALL_SUPPORTFILESDIR=share/mysql           \      -DMYSQL_DATADIR=/srv/mysql                      \      -DMYSQL_UNIX_ADDR=/run/mysqld/mysqld.sock       \      -DWITH_EXTRA_CHARSETS=complex                   \      -DWITH_EMBEDDED_SERVER=ON                       \      -DSKIP_TESTS=ON                                 \      -DTOKUDB_OK=0                       make && make install:<<!                                                            # 多行注释-DCMAKE_INSTALL_PREFIX=                                 指向mysql安装目录-DINSTALL_SBINDIR=sbin                          指向可执行文件目录(prefix/sbin)-DMYSQL_DATADIR=/var/lib/mysql          指向mysql数据文件目录(/var/lib/mysql)-DSYSCONFDIR=/etc/mysql                                 指向mysql配置文件目录(/etc/mysql)-DINSTALL_PLUGINDIR=lib/mysql/plugin    指向插件目(prefix/lib/mysql/plugin)-DINSTALL_MANDIR=share/man                      指向man文档目录(prefix/share/man)-DINSTALL_SHAREDIR=share                        指向aclocal/mysql.m4安装目录(prefix/share)-DINSTALL_LIBDIR=lib/mysql                      指向对象代码库目录(prefix/lib/mysql)-DINSTALL_INCLUDEDIR=include/mysql      指向头文件目录(prefix/include/mysql)-DINSTALL_INFODIR=share/info                    指向info文档存放目录(prefix/share/info)prefix官方推荐设为/usr!install -v -dm 755 /etc/mysql                                   # 创建文件/etc/mysql/my.cnfcat > /etc/mysql/my.cnf << "EOF"# Begin /etc/mysql/my.cnf# The following options will be passed to all MySQL clients[client]#password       = your_passwordport            = 3306socket          = /run/mysqld/mysqld.sock# The MySQL server[mysqld]port            = 3306socket          = /run/mysqld/mysqld.sockdatadir         = /srv/mysqlskip-external-lockingkey_buffer_size = 16Mmax_allowed_packet = 1Msort_buffer_size = 512Knet_buffer_length = 16Kmyisam_sort_buffer_size = 8M# Don't listen on a TCP/IP port at all.#skip-networking# 注意此处 skip 打开会导致 3306端口异常# required unique id between 1 and 2^32 - 1server-id       = 1# Uncomment the following if you are using BDB tables#bdb_cache_size = 4M#bdb_max_lock = 10000# InnoDB tables are now used by defaultinnodb_data_home_dir = /srv/mysqlinnodb_log_group_home_dir = /srv/mysql# All the innodb_xxx values below are the default ones:innodb_data_file_path = ibdata1:12M:autoextend# You can set .._buffer_pool_size up to 50 - 80 %# of RAM but beware of setting memory usage too highinnodb_buffer_pool_size = 128Minnodb_log_file_size = 48Minnodb_log_buffer_size = 16Minnodb_flush_log_at_trx_commit = 1innodb_lock_wait_timeout = 50[mysqldump]quickmax_allowed_packet = 16M[mysql]no-auto-rehash# Remove the next comment character if you are not familiar with SQL#safe-updates[isamchk]key_buffer = 20Msort_buffer_size = 20Mread_buffer = 2Mwrite_buffer = 2M[myisamchk]key_buffer_size = 20Msort_buffer_size = 20Mread_buffer = 2Mwrite_buffer = 2M[mysqlhotcopy]interactive-timeout# End /etc/mysql/my.cnfEOF:<<!cd /usr/binmv mysql_install_db mysql_install_db_bakcp /root/mysql_install_db /usr/bin!mysql_install_db --basedir=/usr --datadir=/srv/mysql --user=mysql &&chown -R mysql:mysql /srv/mysql                         # 初始化数据库以及修改所有者权限cp /root/mariadb-10.5.8/support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld # update-rc.d mysqld defaults chkconfig --add mysqld /etc/init.d/mysqld restart systemctl status mysqld'/usr/bin/mysqladmin' -u root password 'root'           # 为mysql 设置密码#mysql                                                  # 登录,默认没有密码mysql -e "set password = password('WWWeisccn')"         # 为root 用户设置密码mysql -uroot -pWWWeisccn -e "create database eisc character set utf8 collate utf8_bin;"                                                        # 登录数据库并且创建数据库名字为######################################################################################################################################  防火墙配置  ####systemctl restart firewalldfirewall-cmd --permanent --add-port=3306/tcp            # 开放端口 3306firewall-cmd --permanent --add-port=9000/tcpfirewall-cmd --permanent --add-port=80/tcpsystemctl restart firewalld                             # 重启防火墙firewall-cmd --zone=public --list-ports                 # 列出防火墙已经开放的端口netstat -ntlp                                           # 监听运行中的端口运用####  自动启动配置  #####说明:编译安装的运用reboot 后不会自动启动,所以需要加入开机启动配置文件 /etc/rc.d/rc.localecho "source /etc/profilebash /www/server/StartLnmp.sh" >> /etc/rc.d/rc.localchmod +x /etc/rc.d/rc.localecho "nginxsystemctl restart php-fpm/etc/init.d/mysqld restartecho '   LNMP 启动时间 ==========>> `date`' >> /root/LNMPlog.txt" >> /www/server/StartLnmp.sh##################################################################################################################################elseecho "数据库已经安装"fi}azmariadb## 一键执行脚本: wget eisc.cn/file/shell/centos-LNMP.sh ; sh centos-LNMP.sh
 56   7  663天前
admin
1167
######### 1. 添加用户 ###########useradd -m -d /home/eisc -s /bin/bash eisc; passwd eisc# 新建一个子用户,并设置密码#groupadd eisc   # 新建test工作组useradd -g root eisc -d /eisc  # 创建用户eisc是root群组,登录目录是 /eiscecho "aaaassss" | passwd --stdin eisc # --stdin 指定用户更改密码:换行需要手动输入; echo打印密码用管道将密码配置用户密码# usermod -G groupname username # 给已有的用户增加工作组NR=`cat -n /etc/sudoers | grep root | grep ALL | awk -F" " '{print $1}'` # 定义一个变量NR,命令查看 root 的行号sed -i "$NR a\eisc   ALL=(ALL)     ALL" /etc/sudoers # 授权规则是分配权限的执行规则######### 2. 禁用root 用户登录 ###########sed -i "s/#PermitRootLogin.*/PermitRootLogin no/g" /etc/ssh/sshd_config  # 字符串修改######### 3. 添加和允许用户登录 ############ AllowUsers    eisc test@192.168.1.1         #  [əˈ  lau]   允许   指定用户 eisc  和 指定用户且指定IP 登录# DenyUsers    zs eisc     # [diˈ  nai]  禁用    Linux系统账户  zs 和 eisc    echo "AllowUsers admin eisc" >> /etc/ssh/sshd_config # Allow [əˈlaʊ] 允许用户登录 : admin eisc 两个用户,多个用户用空格隔开/usr/sbin/sshd -T # sshd 保存配置/bin/systemctl restart sshd.service # 重启 sshd 服务yum install -y net-tools # 端口查看工具netstat -ntlp # 查看运行的端口exit  lastlog # 查看登录情况sshd -t  # sshd 检查2.记录脚本执行的时间3.Java+Tomcat 环境部署4.CENTOS VIM 批量注释 取消注释  注释指定行范围5.内网机器免密码登录centos相关链接:linux ssh 配置 允许指定ip登录sshlinux centos-ubuntu-debian修改默认远程登陆ssh端口
 0   3  698天前
admin
1155
1.了解docker ;  2.docker 安装脚本:安装,私有仓库,创建虚拟机1. 脚本安装 docker#!/bin/bashupdatesj(){# 更新时间rpmntpdate=`rpm -qa | grep ntpdate | wc -l`if [ $rpmntpdate -gt 0 ]                                                                                        # 相等 -eq    不相等 -ne     大于  -gt     大等于  -ge     小于  -lt       小等于  -le   then       echo "已经安装时间更新 ntpdate"    else           yum install -y ntpdate                                               # 安装工具           ntpdate -u cn.pool.ntp.org                                   # 同步时间           timedatectl set-timezone Asia/Shanghai               # 设置区域           systemctl start ntpd                                         # 启动时间           systemctl enable ntpd                                                # 开机启动:自动同步fi}updatesjinstallDocker(){# 安装 dockerdocker --versionif [ $? -eq 0 ]                                                                        # $? 判断上一条命令是否执行成功, -eq 等于  0  then       echo "已经安装docker"       docker pull centos:7                                                  # 拉取镜像centos7       tagc=$(docker images | grep centos | awk -F" " '{print $3}') ; echo $tagc       tagd="127.0.0.1:5000/rancher/centos:7"       docker tag $tagc $tagd                                             # 打标签       docker rmi $tagd                                                       # 删除标签  else       echo "正在安装docker 中。。。"       wget eisc.cn/file/shell/dockerinstall.sh ; sh dockerinstall.shfi}installDockerxnjdemo(){       useradd demo                                                      # 创建用户  demo       echo "eisc.cn" | passwd --stdin demo                  # 为用户 demo 设置密码为: eisc.cn       chmod u+w /etc/sudoers                                     # 用户写 权限 这个文件       cp /etc/sudoers /etc/sudoers.back       sed -i "/^#/d" /etc/sudoers                                  # 删除开头#号的行       sed -i "/^$/d" /etc/sudoers                                   # 删除空行       echo "domo    ALL=(ALL)       ALL" >> /etc/sudoers                                                                                     # 添加用户权限 所有权限        sudo docker pull centos:7                                    # 拉群centos7 镜像,因为使用的 demo 用户,修改系统需要加上 sudo        sudo docker images                                             # 列出镜像列表        sudo systemctl start firewalld                               # 启动防火墙; stop 关闭        sudo firewall-cmd --permanent --zone=public --add-port=10022/tcp        sudo firewall-cmd --permanent --zone=public --add-port=10080/tcp        firewall-cmd --reload                                            # 开放端口,和重载防火墙配置        firewall-cmd --list-all                                             # 列出防火墙所有规则        # sudo docker run -d --name c7-d1 --privileged=true -p 10022:22 -p 10080:80 \        # -h c7-docker-1 -v /home/fd/container/c7-d-1:/home/c7-d1-ys centos:7 /usr/sbin/init        systemctl restart docker     # docker 无法创建端口映射        docker run --privileged=true -dit -p 10022:22 -p 10080:80 --name eisc centos:7 /usr/sbin/init                                                                                       # 符号  \ 将长命令换行编写;   运行centos7 版本  名字为eisc                                                                                       # 注意:一个单词不能换行后还有空格存在,例如: date  变成:dat  e                                                                                       # -d 后台运行方式                                                                                       # name 创建的容器名,方便启动、关闭、重启、删除容器等操作                                                                                       # privileged=true        加上之后容器内部权限更多,不会出现权限问题                                                                                       # -p 10022:22 -p 10080:80       指定端口映射,可同时放通多个端口                                                                                       # -h c7-docker-1 指定容器主机名                                                                                       # -v /home/fd/container/c7-d-1:/home/c7-d1-ys                                                         宿主机目录映射到容器内部目录                                                                                       # centos:7       本地centos镜像版本                                                                                       # /usr/sbin/init 启动方式       docker exec -it eisc /bin/bash                                                                                        # 进入启动的容器 eisc                                                                                        # -d    后台运行方式                                                                                        # name  创建的容器名,方便启动、关闭、重启、删除容器等操作                                                                                        # privileged=true       加上之后容器内部权限更多,不会出现权限问题                                                                                        # -p 10022:22 -p 10080:80      指定端口映射,可同时放通多个端口                                                                                        # -h c7-docker-1        指定容器主机名                                                                                        # -v /home/fd/container/c7-d-1:/home/c7-d1-ys                                                        宿主机目录映射到容器内部目录                                                                                        # centos:7      本地centos镜像版本                                                                                       # /usr/sbin/init        启动方式}xnjdemocentosxuniji(){# 启动的虚拟机需要执行下面命令 否则无法通过端口映射远程连接docker虚拟机      yum install -y ntpdate                                              # 安装工具      ntpdate -u cn.pool.ntp.org                                       # 同步时间      timedatectl set-timezone Asia/Shanghai                  # 设置区域      systemctl start ntpd                                                  # 启动时间      systemctl enable ntpd                                              # 开机启动:自动同步      yum install -y wgetrepo="centos-yum.sh"if [ ! -e $repo ]; then                 # -e 判断文件存在;参考:Shell if 条件判断文件或目录yum install -y wgetwget www.eisc.cn/file/shell/centos-yum.sh ; sh centos-yum.shelseecho "yum已经切换"fiyum -y install systemd firewalld net-tools ; yum -y install openssh openssh-server openssh-clients systemctl start sshd# ssh-keygen -t rsa                                # 配置免密登陆密钥echo "eisc.cn" | passwd --stdin root}# docker commit c5d63d185542 centos7-csh    # 保存 docker ps -a 运行中的镜像,名字为:centos7-csh# wget eisc.cn/file/shell/docker-xnj.sh ; sh docker-xnj.sh相关链接:  上传运行镜像 docker基础 docker创建虚拟机 KVM复习题安装docker:  https://eisc.cn/index.php?c=read&id=475&page=1
 17   4  716天前
guest
登录之后更精彩~
我的小伙伴
Powered by HadSky 7.7.16
© 2015-2022 PuYueTian
您的IP:8.219.134.200,2022-08-10 08:00:28,Processed in 0.08793 second(s).
Powered by HadSky
小绿叶技术博客