728x90

이론 출처: https://steemit.com/kr/@yahweh87/3

코드설명:https://berrypjh.tistory.com/50

 

블록체인에서 사용되는 '블록' 일정 시간마다(비트코인의 기준으로 10분에 한 번씩 생성됩니다.)

 여러 건의 거래내역을 하나의 블록으로 묶어 기존에 생성된 블록에 체인처럼 계속적으로 연결하는 데이터 구조를 의미합니다. 

 

 

블록은 블록체인의 원소 개념으로, 다수의 거래 정보의 묶음을 의미합니다.

블록에는 블록의 이름이 있는데 Height(높이)라는 용어로 표현되고 있습니다.

한 칸 한 칸 쌓아나가 탑의 형태로 구성된다고 생각하여 Height(높이)라는 말을 쓴다고 합니다.(깊이라고 이해해도 될듯)

하지만 이 높이는 정확한 블록의 이름이 아닙니다. 

블록의 정확한 이름은 TXID라 불리는 블록의 해시값입니다. 이 블록의 해시값은 블록의 헤더 정보(블록의 버전, 이전블록해시,머클루트,타임,bits,논스 정보)를 모두 합산한 후 SHA256으로 변환된 값입니다.

bits : 난이도 해시 목표값을 의미하는 지표

nonce: 블록을 만드는 과정에서 해시값을 구할 때 필요한 재료 역할을 수행한다.

블록의 구성요소

여러 요소들이 있지만

크게 블록 헤더블록 바디로 나눌 수 있다.

블록 하나 만들기

(리눅스 우분투에서 코드 작성중)

<block.js>

lass Block{
        constructor(header, body){
		this.header = header
		this.body = body
	}
}

class BlockHeader{
        constructor(version, previousHash, timestamp, merkleRoot, bit, nonce){
	     this.version = version
	     this.previousHash = previousHash
	     this.timetamp = timestamp
	     this.merkleRoot = merkleRoot
	     this.bit = bit
	     this.nonce = nonce

	}
}

header와 body가 들어간 block클래스를 만들고 블록의 header class도 만들어준다.

npm init

버전과 모듈설치확인 위해서 package.json 파일 만들고 fs불러서 버전표시해보자

const fs = require('fs')

//버전계산하는 함수 
function getVersion(){
	const package = fs.readFileSync("package.json")
	console.log(JSON.parse(package).version)
	return JSON.parse(package).version

}

 

 

# node block.js

 

첫번째 block값 대입한다

function createGenesisBlock(){
	const version = getVersion()
	const previousHash = '0'.repeat(64)
	const timestamp = parseInt(Date.now()/1000)

}

 

version은 getVersion에서 나온 값을 대입한다.

previousHash는 이전 블록이 없는 첫번째 블록이므로 64비트 '0'을 대입

timestamp는 Date써서 현재 시간 넣어두기

 

머클리루트 값을 넣기 위해 설치

 

npm i merkle

 

function createGenesisBlock(){
	const version = getVersion()
	const previousHash = '0'.repeat(64)
	const timestamp = parseInt(Date.now()/1000)
	const body = ['hello block']
	const tree = merkle('sha256').sync(body)
	const merkleRoot = tree.root() || '0'.repeat(64)
	const bit = 0
	const nonce = 0

	console.log("version : %s, timestamp: %d, body : %s",version,timestamp,body)
	console.log("previousHash : %d", previousHash);
	console.log("tree :")
	// console.log(tree)
	console.log("merkleRoot : %s", merkleRoot);
	console.log("merkleRoot : %s", merkleRoot.toString('hex'));

	// const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
	// return new Block(header, body)

}

해당 모듈 설치 후 body에 들어갈 트랜잭션(거래내역)인 첫 번째 데이터로 hello block을 넣음

나머지는 0대입하고 만들어보고 실행해보기

 

node block.js

하면

(아까는 merkleRoot 안나왔는데 %d 여서 그랬음 %s 이게 string값 불러오는건가보다 둘이 똑같이 뜨네)

 

 

첫번째 블록 생성하기

function createGenesisBlock(){
	const version = getVersion()
	const previousHash = '0'.repeat(64)
	const timestamp = parseInt(Date.now()/1000)
	const body = ['hello block']
	const tree = merkle('sha256').sync(body)
	const merkleRoot = tree.root() || '0'.repeat(64)
	const bit = 0
	const nonce = 0

	console.log("version : %s, timestamp: %d, body : %s",version,timestamp,body)
	console.log("previousHash : %d", previousHash);
	console.log("tree :")
	// console.log(tree)
	console.log("merkleRoot : %s", merkleRoot);
	console.log("merkleRoot : %s", merkleRoot.toString('hex'));
     
	//헤더에 대입
	const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
    return new Block(header, body)

}
//값넣어서 블록생성
const block = createGenesisBlock()
console.log(block)

위에 대입한 결과를 BlockHeader class로 정보를 전달하고 

블록헤더와 바디를 Block class에 전달하여 첫번째 블록을 생성하였다.

 

node block.js  로 실행결과보기

 

block.js 전체코드는 이와같다.

더보기
const fs = require('fs')
const merkle = require('merkle')

class Block{
        constructor(header, body){
		this.header = header
		this.body = body
	}
}

class BlockHeader{
        constructor(version, previousHash, timestamp, merkleRoot, bit, nonce){
	     this.version = version
	     this.previousHash = previousHash
	     this.timetamp = timestamp
	     this.merkleRoot = merkleRoot
	     this.bit = bit
	     this.nonce = nonce

	}
}

//버전계산하는 함수 
function getVersion(){
	const package = fs.readFileSync("package.json")
	console.log(JSON.parse(package).version)
	return JSON.parse(package).version

}


//getVersion()

function createGenesisBlock(){
	const version = getVersion()
	const previousHash = '0'.repeat(64)
	const timestamp = parseInt(Date.now()/1000)
	const body = ['hello block']
	const tree = merkle('sha256').sync(body)
	const merkleRoot = tree.root() || '0'.repeat(64)
	const bit = 0
	const nonce = 0

	console.log("version : %s, timestamp: %d, body : %s",version,timestamp,body)
	console.log("previousHash : %d", previousHash);
	console.log("tree :")
	// console.log(tree)
	console.log("merkleRoot : %s", merkleRoot);
	console.log("merkleRoot : %s", merkleRoot.toString('hex'));
     
	//헤더에 대입
	const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
    return new Block(header, body)

}
//값넣어서 블록생성
const block = createGenesisBlock()
console.log(block)

 

 

 

 

 

728x90
728x90

Hash

sha256

단방향 암호화, 자리수 64자리로 고정됨

 

해시함수 설명:

더보기

해시함수를 이용한다면 어떤 길이의 입력값이라도 256비트의 고정된 결과값을 출력할 것이고

입력값의 아주 일부만 변경되어도 전혀 다른 값이 출력되는 특징 때문에 데이터가 변경되었는지 쉽게 확인할 수 있습니다.

추가적으로 해시함수는 입력된 값이 같을 경우 항상 같은 결과 값을 출력해야합니다.

https://steemit.com/kr/@yahweh87/2)

 

머클트리 Merkle tree, 머클 루트 Merkle root

데이터가 위변조 되었는지 효율적으로 확인하기 위한 용도로 사용됨

자바스크립트에서 merkletreejs를 이용해 사용할 수 있다.

https://blockone.tistory.com/11 -Merkle tree

더보기

출처 : https://blockone.tistory.com/11

머클트리 Merkle tree

해시트리 라고도 한다. 여러 블록으로 나뉘어 있는 데이터를 전송할 때 데이터가 변조되지 않았음  보증하는 용도로 쓰인다. 특히 p2p네트워크에서 전송받는 데이터에 오류가 있거나 외부로부터 조작이 있었는지 검증하는 용로도로 쓰인다.

블록체인에서는 블록에 포함된 거래 데이터를 요약해 트리 형태로 만들게 되는데 해시함수를 활용해 두개의 거래 데이터를 하나의 데이터로 묶음으로써 용량을 절약할 수 있다.

머클 루트 

블록에 들어있는 모든 거래내역을 요약한 데이터로 최소한의 정보로 인증할 수 있도록 도와준다.

개별 거래에 대한 트랜잭션을 검증하는 기능을 수행하는 노드(라이트노드)에 대해서는 중요한 데이터만 갖고 있게 한다. 외부에서 다른 블록의 거래내역을 조작하면 머클루트를 대조하여 비교하게 된다. 가장 밑단에 있는 거래를 제외한 나머지내역을 두개씩 짝지어 해시값을 얻고 또 그 해시끼리 짝지어 암호화하는 식이다. 이렇게 모든 거래 내역에 해시값을 얻는 과정을 거듭하여 나무 모형으로 만들면 머클트리가 된다. 결국 머클트리 그 자체가 해시로 이루어져 있다. 하나의 트랜잭션이 변조되면 머클루트까지 모든 값이 바뀌게 되는 쇄도효과가 일어난다.

 

 

합의 알고리즘

-작업증명Proof of Work

-지분증명 Proof of Stake

728x90
728x90

 

//함수 참조
console.dir(add)
console.dir(sub)

https://www.howdy-mj.me/javascript/var-let-const/

에서 가져온 내용임.

 

https://medium.com/@ethannam/javascripts-memory-model-7c972cd2c239

변수 variable

하나의 값을 저장하기 위해 확보한 메모리 공간 자체  또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말함

 

자바스크립트는 개발자가 직접 메모리 제어못함

그저 변수를 통해 안전하게 값에 접근할 수 있음. 

 

변수에 값 저장하는 것  :  할당(assignment,대입,저장)

변수에 저장된 값을 읽어들이는 것  :  참조(reference)

변수명을 자바스크립트 엔진에 알리는 것 : 선언(declaration)

 

변수 선언

var, const, let      

 

자바스크립트에서 변수 선언은 

선언 -> 초기화    단계를 거쳐 수행된다. 

선언단계: 변수명을 등록하여 자바스크립트 엔진에 변수의 존재를 알린다.
초기화 단계: 값을 저장하기 위한 메모리공간을 확보하고 암묵적으로 undefined를 할당해 초기화한다.

 

 

var kmj
console.log(kmj) // output: undefined

var 키워드를 이용한 변수 선언은 선언 단계와 초기화 단계가 동시에 진행되어, kmj에 암묵적으로 undefined를 할당해 초기화한다.

그런데 반대로, console을 먼저 찍어도 반환 값이 undefined로 나온다.

console.log(kmj) // output: undefined
var kmj

이는 변수 선언이 런타임에서 되는 것이 아니라, 그 이전 단계에서 먼저 실행되기 때문이다.

자바스크립트 엔진은 소스코드를 한 줄씩 순차적으로 실행하기에 앞서,

변수 선언을 포함한 모든 선언문(ex. 변수 선언문, 함수 선언문 등)을 찾아내 먼저 실행한다.

즉, 변수 선언이 어디에 있든 상관없이 다른 코드보다 먼저 실행되는 특징을 호이스팅(hoisting)이라 한다.

 

변수 선언 뿐만 아니라, var, let, const, function, function*, class 키워드를 사용해 선언한 모든 식별자(변수, 함수, 클래스 등)는 호이스팅이 된다.

 

 

변수 할당

변수에 값을 할당 할 때에는 할당 연산자(=)를 사용한다.

var kmj // 변수 선언
kmj = 'howdy-mj' // 값의 할당

var kmj = 'howdy-mj' // 변수 선언과 할당

변수 선언과 할당은 하나의 문(statement)으로 단축 표현할 수 있지만, 두 개의 실행 시점이 다르다.변수 선언이 호이스팅되어 런타임 이전에 실행되지만,

값의 할당은 소스코드가 순차적으로 실행되는 런타임에 실행된다.

따라서 변수의 할당과 console을 실행하는 위치에 따라 반환되는 값이 다르다.

 

console.log(kmj) // output: undefined

var kmj = 'howdy-mj'
console.log(kmj) // output: howdy-mj

kmj라는 변수에 새로운 값을 재할당할 수도 있다.

console.log(kmj) // output: howdy-mj

kmj = 'mj' //재할당
console.log(kmj) // output: mj

재할당은 변수에 저장된 값을 다른 값으로 변경하는 것으로, 만약 변경할 수 없는 값이라면 이는 변수가 아니라 상수(constant)라 부른다.

 

함수 호이스팅

더보기

위에서 function 키워드로 선언한 모든 식별자도 호이스팅이 된다고 했는데, 정확히 어떻게 이루어질까?

먼저 함수가 정의되는 방식 네 가지를 살펴보자.

//1. 함수 선언문
//함수 이름 생략 불가능 
function add(x, y) {
  return x + y
}
// 2. 함수 표현식
// 함수 이름 생략 가능
var add = function(x, y) {
  return x + y
}
// 함수 이름 작성 시,
// var add = function plus(x, y) {
//   return x + y
// }

// 3. Function 생성자 함수
var add = new Function('x', 'y', 'return x+ y')

// 4. 화살표 함수
var add = (x, y) => x + y

위에서 함수 선언문과 함수 표현식의 호이스팅 결과를 먼저 보자.

 

// 함수 참조
console.dir(add) // output: f add(x, y)
console.dir(sub) // output: undefined

// 함수 호출
console.log(add(2, 5)) // output: 7
console.log(sub(2, 5)) // output: Uncaught TypeError: sub is not a function

// 함수 선언문
function add(x, y) {
  return x + y
}

// 함수 표현식
var sub = function(x, y) {
  return x + y
}

 

함수 선언문의 경우, 런타임 이전에 자바스크립트 엔진에서 먼저 실행되어, 함수 자체를 호이스팅 시킬 수 있다.

반면, 함수 표현식은 위에서 봤던 변수 호이스팅과 같이 런타임 이전에 해당 값을 undefined로 초기화만 시키고, 런타임에서 해당 함수 표현식이 할당되어 그때 객체가 된다.

스코프(scope)

는 식별자(ex.변수명,함수명,클래스명 등)의 유효범위를 뜻하며 선언된 위치에 따라 유효범위가 달라진다.

전역에 선언된 변수, 전역 스코프

지역에 선언된 변수는 지역 스코프를 갖는다.

 

전역변수 : 어디에서든지 참조가 가능한 값

지역변수 : 함수몸체내부를 말한다.  자신의 지역스코프와 그 하위 지역스코프에서 유효하다.

 

 

var, let, const의 차이

var 문제점 

  • 변수 중복 선언 가능, 예기치 못한 값을 반환할 수 있다.
  • 함수 레벨 스코프로 인해 함수 외부에서 선언한 변수는 모두 전역 변수로 된다.
  • 변수 선언문 이전에 변수를 참조하면 언제나 undefined를 반환한다

1. 변수 중복 선언 불가

(1) let

let 키워드로는 변수 중복 선언이 불가하지만, 재할당은 가능하다.

 

더보기
let name = 'kmj'
console.log(name) // output: kmj

let name = 'howdy' // output: Uncaught SyntaxError: Identifier 'name' has already been declared

name = 'howdy'
console.log(name) // output: howdy

 

(2) const

const가 let과 다른 점이 있다면, 반드시 선언과 초기화를 동시에 진행되어야 한다.

const name; // output: Uncaught SyntaxError: Missing initializer in const declaration
const name = 'kmj'

const도 let과 마찬가지로 재선언이 불가하며, 더 나아가 재할당도 불가하다. 재할당의 경우, 원시 값은 불가능하지만, 객체는 가능하다. const 키워드는 재할당을 금지할 뿐, ‘불변’을 의미하지 않는다.

// 원시값의 재할당
const name = 'kmj'
name = 'howdy' // output: Uncaught TypeError: Assignment to constant variable.

// 객체의 재할당
const name = {
  eng: 'kmj',
}
name.eng = 'howdy'

console.log(name) // output: { eng: "howdy" }

2. 블록 레벨 스코프

let, const 키워드로 선언한 변수는 모두 코드 블록(ex. 함수, if, for, while, try/catch 문 등)을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.

위 var 키워드로 예를 들었던 것을 그대로 가져와 바꾸면 아래와 같은 결과가 나온다.

let a = 1

if (true) {
  let a = 5
}

console.log(a) // output: 1

var 키워드로 선언한 경우 5가 나왔지만, let 키워드로 선언한 경우 if 문 안에 있는 것은 지역 스코프를 가져 전역에서 console을 찍었을 경우, 전역에 있는 a가 결과 값으로 출력된다. (const 키워드도 let 키워드와 동일하게 동작한다)

3. 변수 호이스팅

(1) let

let 키워드로 선언한 변수는 선언 단계와 초기화 단계가 분리되어 진행된다. 즉, 런타임 이전에 자바스크립트 엔진에 의해 선언 단계가 먼저 실행되지만, 초기화 단계가 실행되지 않았을 때 해당 변수에 접근하려고 하면 참조 에러가 뜬다.

let도 호이스팅하지만 변수에 접근할 수 없다,쓸수 없다고 경고창떠요..

console.log(name) // output: Uncaught ReferenceError: name is not defined

let name = 'kmj'

따라서 let 키워드로 선언한 변수는 스코프의 시작 지점부터 초기화 단계 시작 지점까지 변수를 참조할 수 없는 일시적 사각지대(Temporal Dead Zone: TDZ) 구간에 존재한다.

 

(2) const

const 키워드는 선언 단계와 초기화 단계가 동시에 진행된다.

console.log(name) // output: Uncaught ReferenceError: Cannot access 'name' before initialization

const name = 'kmj'

let 키워드로 선언한 경우, 런타임 이전에 선언이 되어 자바스크립트 엔진에 이미 존재하지만 초기화가 되지 않았기 때문에 name is not defined라는 문구가 떴다. 하지만 const 키워드로 선언한 경우, 선언과 초기화가 동시에 이루어져야 하지만 런타임 이전에는 실행될 수 없다. 따라서 초기화가 진행되지 않은 상태이기 때문에 Cannot access 'name' before initialization 에러 문구가 뜬다.

정리

기본적으로 변수의 스코프는 최대한 좁게 만드는 것을 권장한다. 따라서, var 키워드 보다는 let과 const 키워드를 사용하며, 변경하지 않는 값(상수)이라면 let 보다는 const 키워드를 사용하는 것이 안전하다.

 

 

 

 

 

728x90
728x90

계속 헷갈리는게 root계정인지 일반계정인지 sudo su가 슈퍼관리자로 가능하대서 다되는구나 이생각

무지성으로 따라해서 ㅎㅎ

 

터미널에서 하던걸 vscode에서 해볼까했는데 저장안됨

어 저번엔 됐었는데

 

이유는 우분투 연결한 vscode는 

일반계정으로 열리는 거임

 

근데 터미널에서는 sudo su- 슈퍼계정 root로 파일들 만들잖아

그 파일이 일반계정으로 열리는 vscode에서는 수정이 안되는거임 권한이 없어서

 

그동안 일반계정으로 했다가 root계정으로 했다가 막한 흔적들

 

일반계정으로 파일 만들어보니까

vscode에서도 수정잘될 수 있는거 확인.

 

 

왜 파일만들때 sudo su-로 root계정에 들어가서 작업하는거지?

root에서만 할 수 있는 작업들이 있다 하더라고

 

728x90
728x90

 

 

분산되어 저장한다는 것은 탈중앙화를 의미

P2P(Peer to Peer) 네트워크를 통해서 관리되는 분산데이터베이스에 의한 형태

분산처리와 암호화

블록체인 네트워크에 연결된 여러 컴퓨터(노드)에 저장 및 보관하는 기술

 

블록들을 체인 형태로 묶은 형태

블록들이 형성된 후 시간의 흐름에 따라 순차적으로 연결된 '사슬(체인)'의 구조를 가지게 된다

 

특장점

 

  • 분산저장 (기존거래방식은 데이터를 위,변조하기 위해서 중앙서버를 공격)
  • 여러 명이 동일한 데이터를 저장
  • 블록체인 네트워크를 위,변조하기 위해서는 참여자(노드)의 거래 데이터를 모두 공격해야하기 때문에 사실상 해킹이 불가능
  • 중앙관리자 불필요(중앙기관,관리자 없어도 다수가 데이터를 저장,증명할 수 있기 때문에 탈중앙화가 가능)

 

블록체인의 기술 활용

  • 금융거래
  • 개인의료정보
  • 영상 또는 이미지, 콘텐츠
  • 부동상
  • 의료
  • 인적자원

 

 

블록체인의 기술

  • 해쉬(Hash) 함수를 사용
  • 스마트계약을 활용

블록체인 동작원리

  • 하나의 새로운 블록을 구성한 경우, 이전부터 이어져 내려오던 블록체인의 맨끝에 이 새로운 블록을 연결
  • 새로 구성한 블록의 이름에 해당하는 해시를 찾아내는 일(목표 값보다 작아야한다는 조건을 충족해야함.)

예시)목표 해시 값: 00ff32라고 가정

새로 만든 블록의 해시값: (블록생성에 실패)

새로 찾아낸 해시값: 00c3b1(새로운 블록의 생성에 성공)

 

 

728x90
728x90

 

 

 

와우 어렵구나.!!!

 

되긴됐는데..혼자서는 절대못짤거같음...ㅎ

 

 

 

while반복문

 

while [조건]
do
명령1
명령2
done

 

 

기본루프

number가 2보다 작을 동안(le) 반복

#!/bin/bash

number=0

while [ $number -le 2 ]
do
  echo "Number: ${number}"
  ((number++))
done

무한루프

if문을 이용하여 2보다 커지면 while 문을 탈출

#!/bin/bash

number=0

while :
do
  if [ $number -gt 2 ]; then
    break
  fi

  echo "Number: ${number}"
  ((number++))
done

 

날짜를 이용한 루프

 시작일자(2019.01.01)부터 종료일자 전일(2019.01.31)까지 일자를 출력하는 방법

#!/bin/bash

startDate=`date +"%Y%m%d" -d "20190101"`
endDate=`date +"%Y%m%d" -d "20190201"`

while [ "$startDate" != "$endDate" ] ; 
do 
    echo $startDate

    startDate=`date +"%Y%m%d" -d "$startDate + 1 day"`; 
done

종료일자(2019.02.01)까지 출력하기 위해서는 종료일자에 1을 더하여 whilte문 종료조건을 늘려주면 된다

#!/bin/bash

startDate=`date +"%Y%m%d" -d "20190101"`
endDate=`date +"%Y%m%d" -d "20190201"`
endDate=`date +"%Y%m%d" -d "${endDate} + 1 day"`

while [ "$startDate" != "$endDate" ] ; 
do 

    echo $startDate

    startDate=`date +"%Y%m%d" -d "$startDate + 1 day"`; 
done

 

 

 

 

 

 

출처: https://wikidocs.net/29981

https://judo0179.tistory.com/122?category=456195 

 

쉘 스크립트 반복문 사용하기

Shell Loop Types 이번 시간에서는 Unix Shell에서 사용하는 반복문에 대해서 알아본다. 반복은 일련의 명령을 반복할 수 있도록 하는 프로그래밍 도구로서 아래에서 다양한 반복문 종류를 살펴보도록

judo0179.tistory.com

https://blog.naver.com/yse1030/222600492209

 

[Linux] 반복문

#Linux #while #리눅스 #반복문 #while #for While Loop while문의 조건이 참이면 코드를 계속해서 반복...

blog.naver.com

 

728x90
728x90

실행했을 때

원하는 저장공간에 

오늘 날짜로 파일명이 만들어지는

스크립트

 

 

순서는 이렇게..

 

mkdir 폴더생성

vi 실행파일.sh

스크립트 적기

실행권한설정

실행하기

 

 

 

스크립트

 

date 날짜띄우는명령어 YYMMDD 변수에 담아줘

(date_log로 폴더가 저장됐으면 하는 )원하는 경로 DIR_LOG 변수에 담아줘

변수사용해 오늘날짜 뜨는 파일명 FILE_NAME 라고

 

만약에 DIR_LOG가 이 디렉토리아니면(저 경로에 date_log없으면)

실행

DIR_LOG 만들어

파일내용안에 date날짜 넣어

 

아니면 (만약 저 경로에 date_log있으면)

"이름같은폴더가 있음" 뜨게 해

끝.

 

#!/bin/bash

YYMMDD=`date +"%y%m%d"`
DIR_LOG="/home/`whoami`/date_log"
FILE_NAME="Date_${YYMMDD}.txt"
if [ ! -d $DIR_LOG ]
then
   mkdir $DIR_LOG
   `date > ${DIR_LOG}/${FILE_NAME}`
else
   echo "이름이 같은 폴더가 이미 있음."
fi

 

 

 

 

특수문자  >,<,>> 는 입출력의 방향바꾸는 특수문자

명령1>파일이름
(파일의 내용을 명령1로 바꿉니다.)

명령1>>파일이름 
(파일의 내용에 명령1을 추가합니다)
https://hack-cracker.tistory.com/26

쉘 스크립트 if문 옵션 -d

파일조건
[-d file] file이 디렉토리이면 참이다
https://webstone.tistory.com/79

 

 

에러 해결

처음에 

DIR_LOG="/home/`whoami`/date_log"

이렇게 하니까 안나옴

syusmm 내계정넣어주면 나오는데.

 

`whoami`는 현재 사용자의 이름을 출력하는 명령어

 

 

안됐던 이유

 

 

root에서 

/home/`whoami`/ 찾으려하니까 안나오는 거임

 

 

나와서 이렇게 보면

home안에 계정들 있지

 

 

 

 

syusmm 계정에서는 실행 가능!

 

 

 

다시 해보면

syusmm계정에서

실행(은 되지만 이미 있다고뜸)

 

root로 가면 안됨

 

 

sudo는 현재 계정에서 단순히 root의 권한만 빌리는 것

su는 현재 계정에서 root계정으로 전환하는 명령어

 

su는 root계정의 환경변수를 가져오지 않고 현재 계정의 환경변수를 사용하게 될 것이고

su -는 root계정의 환경변수까지 모두 가져와 root계정에 접근하게 되는 것.

https://jootc.com/p/20170122130

 

 

 

 

+ 안됐던 이유2

실행권한 설정이 안되어있었음

 

권한 설정

r읽기

w쓰기

x실행

 

소유자에게 실행권한 부여함

chmod u+x file.txt 

리눅스 권한설정

숫자로 한번에 권한 변경해도 됨
chmod 000 test.c
사용자, 그룹, 다른사용자의 모든 권한을 제거한다.
chmod 777 test.c
사용자, 그룹, 다른사용자의 모든 권한을 추가한다.
chmod 700 test.c
사용자에게만 모든 권한을 준다.
chmod 744 test.c
사용자에게는 모든 권한을 주고, 그룹, 다른 사용자에게는 읽기 권한만 준다

744라는 숫자는 이렇게 해석할 수 있다.

사용자
r w x
4 + 2 + 1 = 7

그룹
r - - 
4

다른 사용자
r - - 
4
https://withcoding.com/103
https://nachwon.github.io/shell-chmod/

 

 

 

 

 

728x90
728x90

 

상황: 

우분투 연결안된 비주얼코드창에서 마리아db연결하겠다고 삽질하고 있었던 것을 깨닫

 

마리아db 이미 깔려있고 리눅스창에서 작업해야되는거니까 mysql 워크벤치 연동은 의미없다는 것을 깨닫

 

비주얼코드 우분트연결 창 켜서 

폴더만들어서 안에 로그인되는 코드넣어놓고 작업시작

npm i

디비 생성

 

역시 같은 에러.

이 오류에 경우

 

1. 비번 틀렷을 경우

2. 권한설정이 안됐을 경우.

3. 기타 등등 있대서

 

비번은 바꿔주고 확인해봤으니 아니고

 

 

 

비번바꾸기

use mysql;

사용자와 비밀번호 출력하기

select user, password from user;

abc 사용자의 비밀번호를 1234로 설정

update user set password=password('1234') where user='abc';

변경 사항 적용

flush privileges;

 

 

 

 

 

 

권한설정이 문제인가 해서

 

mariadb 계정 권한설정

MariaDB [mysql]> grant all privileges on *.* to 'test'@'localhost' with grant option; Query OK, 0 rows affected (0.002 sec)

https://94mogi.tistory.com/7

바꿔봤는데도 안됐음 

 

 

우분투 파일 권한 설정

이 문젠가 싶어서 그것도 해봄 

하위폴더까지 다 권한줌

[root@~/]# chmod 755 -R /폴더명

777도 해봄(이거는 보안상 위험할 수 있대서 다시 755로 바꿨다, 물론 에러 원인은 아니었지만)

 

(이거 개념 나중에 참고하삼 https://withcoding.com/103)

연산자 설명 배리 굿https://nachwon.github.io/shell-chmod/

 

[Shell] chmod - 파일 및 폴더의 권한 설정

chmod 셸 명령어는 파일 또는 폴더의 권한을 변경할 때 사용한다.

nachwon.github.io

 

 

여전히 같은 에러 뜸

 

이번에는 계정이 문젠가 싶어서 

기존계정 삭제하고 다시 만들어봄

 

 

 

mariadb 계정 삭제

 

use mysql

DROP USER '계정'@'접속대역';

 

새로 만들고

권한설정도 하고

 

플러그인이 문제인가 싶어서 해봄

MariaDB [mysql]>  update user set plugin='mysql_native_password' where user='mariatest';

확인

MariaDB [mysql]> select user,host,plugin from mysql.user;

 

 

이걸로 해봤는데도 안됨

 

 

 

 

 

혹시나해서 비밀번호 초기화 해봄

(및 보안강화를 위한 설정명령어, 라고 함.)

 

sudo mysql_secure_installation

이후에 우분투 켜서 다시 접속하려는데 안됨

mysql -u root -p

sudo mysql

이거 둘다 안됨

 

 

 

 

mariadb들어갈때 

sudo mysql해서 들어가는데 

에러뜸

 

 

새로운 에러 등장~~

에러 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

 

 

 

service mysql start 

sudo su-로 들어가서 하니까 시작되고

나와서

sudo mysql하니까 접속됨

 

 

 

들어와서 db생성 실행해보니

 

역시 안되고

 

 

엇 생각해보니까

이 mariadb 포트가 3307인데 

config에 포트 추가로 넣은거 걍 아무거나 넣어본거였거든

 

똑같은 포트번호 3307으로 해봄

 

 

 

 

와우 

생성잘됨

 

 

삽질2 포트번호가 달라서 그랬던거임

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

생각해보니까 이 에러도

 

전에 mariadb깔고 실행할때 떴던 에러인데

기존에 깔려있는 mysql이 3306포트를 써서 mariadb량 겹쳐서 위에 에러가 떴거든

그때 mariadb포트를 3307으로 바꿔줌

(mariadb설치시 위 에러해결 이거 참고하슈 : https://codecoco.tistory.com/58?category=524414

 

 

 

db안에 회원가입한거 잘들어왔나 확인

 

응잘들어옴 로그인도 잘됨

 

 

 

mariadb

로그인하기 db생성하기 

 

끝~~

 

 

(아근데 로그인하는 코드자체 제로초보고 다 따라한거라 나중에 해봐야겠다...

혼자 해보려다가 잘안됐음.. 여기서 시간 많이 먹긴함ㅋ)

 

 

728x90
728x90

 

1) MariaDB 접속
# mysql -u root -p
Enter password: 패스워드 입력

2) Database 리스트 확인
$ show databases;

2-1) 없다면 생성
$ create database DB명;

 

3) 기본으로 생성되어 있는 mysql 데이터베이스를 사용한다
$ use mysql;



4) mysql의 user 테이블에서 이미 생성된 계정 확인
$ select host, user from user;



출처: https://postitforhooney.tistory.com/entry/MySql-Mariadb-MYsql-사용자-권한주기-및-확인 [PostIT]

 

이렇게 해서

우분투 안에 마리아디비 설치해서 이렇게 계정있는데

 

 

얘를 어떻게 nodejs랑 연결하나..

 

 

mysql이랑 같은거면 그 창으로 볼 수 없나..mysql했던것처럼 npx sequelize db:create 하면 db생성되나..

 

 

https://postitforhooney.tistory.com/entry/MySql-Mariadb-MYsql-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B6%8C%ED%95%9C%EC%A3%BC%EA%B8%B0-%EB%B0%8F-%ED%99%95%EC%9D%B8

 

[MySql] Mariadb, MYsql 사용자 권한주기 및 확인

 # MariaDB에 사용자 권한주기 1) MariaDB 접속 # mysql -u root -p Enter password: 패스워드 입력 2) Database 리스트 확인 $ show databases; 2-1) 없다면 생성 $ create database DB명; 3) 기본으로 생성되..

postitforhooney.tistory.com

 

로그인 프론트하는것도 계속 모듈못찾길래

이전에 해놓은 nodebird 코드 가져다가 했지만 역시 모듈못찾음

일단 mariadb와 nodejs 연결이전에 확인 어떻게 하는지부터 봐야겠음

 

 

 

 

 

헷갈리는거

 

기존에 깔아둔 

mysql이랑 mariadb같은거임?

mysql workbench에는 mariadb에서 생성된 db애들 없던데?

 

 

 

 

헷갈려서 찾아보기로 함

 

  • MySQL : 오라클에서 관리하는 오픈소스 데이터베이스, 하지만 2중 라이선스로 커뮤니티, 엔터프라이즈 2가지 버전이 존재(커뮤니티 버전에서는 일부 기능이 제한됩니다) 
  • MariaDB : MariaDB재단에서 관리하는 오픈소스 데이터베이스, GPL(General Public License) v2 라이선스로 자유로운 사용 가능

라고 함. 출처: https://mentha2.tistory.com/42 [행궁동 데이터 엔지니어]

 

MySQL Workbench(워크벤치)를 이용한 MariaDB 테이블 생성

MySQL WorkBench(워크벤치)를 이용한 MariaDB 테이블 생성 방법입니다. MySQL과 MariaDB는 다른 DBMS(Database Management System)인데 MySQL용 Workbench로 MariaDB 테이블을 생성한다니 좀 이상하죠? MariaDB는..

mentha2.tistory.com

 

오 그리고

기존에 깔아둔 MySQL WorkBench(워크벤치)에서 mariaedb쓸 수 있다고 함

 

 

 

 

해보니까 

밑에와 같은 코드글있는 test.sql 생성됨

 

 

이 코드 줄을 우분투에 깔린 마리아db에 넣어주니까

오 생성됐다

 

 

엥 마지막은 에러뜨네

 

 

그래도 필드안까지 떠.

 

 

그래도 이건 여전히 우분투창으로 확인하는거고

워크벤치에서 어떻게 보나..

 

 

 

흠...읽다가https://ing-yeo.net/2020/02/study-nodejs-database-mariadb/

 

 

 

 

https://docs.microsoft.com/ko-kr/azure/mariadb/connect-workbench

 

빠른 시작: MySQL Workbench 연결 - Azure Database for MariaDB

이 빠른 시작에서는 Azure Database for MariaDB에서 데이터를 연결하고 쿼리하는 데 MySQL Workbench를 사용하는 단계를 제공합니다.

docs.microsoft.com

이거보면서

워크벤치에서

database 눌러서

새 연결connections으로 만들어봤음

 

 

생기긴 했는데

된걸까?

 

오 된거네

우분트 마리아db에서 만든 거

이안에 생성됨

 

 

 

 

 

 

권한설정하면 된다길래

 

 

 

근데 아직 안됨요

 

 

 

 

 

암호화된 비번보고

그게 비번인줄 알고 쉬운거로 바꿔보려함ㅋㅋㅋ(https://brunch.co.kr/@artiveloper/21)

 

MariaDB 비밀번호, 권한 설정

데이터베이스 초기 비밀번호, 권한 설정 | MySQL이나 MariaDB 는 초기 설치 시, 루트 계정의 비밀번호 세팅을 해줘야한다. 3가지 방법이 있다. 1.  root 계정 접속 후, mysql database 의 user table 에서 비

brunch.co.kr

https://www.codingfactory.net/11437

 

 

 

 

 

내 프로젝트 창에 이거 깔고..

npm i mariadb

하고 

에러나는거 일단 주석처리해놓음

npm start

 

 

https://gollumnima.github.io/posts/nodeJS_4

 

 

허선생님과 함께하는 Maria DB로 데이터 만들기와 Node.js에서 적용 - 둘둘`s dooreplay!

Maria db 설치하기 brew install mariadb 명령어로 설치! 서버 시작 : mysql.server start 서버 멈춤 : mysql.server stop 실행중인 서버 상태확인 : mysql.server status 접속 : mysql -uroot 스크롤을 내리면 나오는 캡쳐들이

gollumnima.github.io

이거 해보기..

 

아.

생각해보니까

지금까지 비주얼코드에서 mariadb쓰려고 했음

 

내가 해야되는거는 리눅스에서 작업해야되는건데!!!

 

리눅스 우분투로 로그인코드 복사해서 넣어주고 다시 시작!!

728x90
728x90

우분투 vscode연동

https://ropiens.tistory.com/156

 

WSL2 Ubuntu VScode 연동

들어가기에 앞서 윈도우에서 리눅스를 가상환경을 지원해주기 시작하면서 컴퓨터에 듀얼부팅과 같은 불편한 작업이 없어져서 좋아졌지만, 안타깝게도 우리가 눈앞에 마주한 것은 검은색 바탕

ropiens.tistory.com

 

https://evandde.github.io/vscode-wsl/

 

 

 

 

vscode에서 작업하는 법

 

 

 

 

오픈폴더눌러서

 

내 계정으로 

이부분 놓쳤었는데 알려줌..후..

728x90
728x90

멀티 스크립트 작성하기

 

홈계정 들어가서 

/home/내계쩡

 

디렉토리 만들어

mkdir 이름

 

주석은 표시 안돼

빈베이스에 쓴다 이말임 걍

날짜 뜨고

whoami  

(로컬 시스템에 현재 로그온 사용자에 대 한 사용자, 그룹 및 권한 정보를 표시 합니다. 매개 변수 없이 사용 하는 경우 whoami 현재 도메인 및 사용자 이름을 표시 합니다.)

 

cat 으로 쓴거 확인

 

아직 색이 흰색임

 

 

권한설정해줘야함 

색바뀌었어

 

위에꺼랑 비교해보면 

x생김

실행가능해진거야~~

 

 

이렇게 할 수도 있음 

x추가로 생김

이제 그룹사용자도 가능하고 외부유저도 사용가능

 

(나 rwx 여기 개념 다시 봐야겠다잉 3개로 끊어서 뭐시기였는지 기억이 안나)

 

 

실행해보면

 

 

echo

에코써서 우리가 어떤 명령어 쓰고 싶었는지 보기 편하게

 

 

문자내 따옴표는

 

작은 따옴표 쓰고 싶으면

"let's play"

큰 따옴표 쓰고 싶으면

'"what"'

 

이렇게 반대걸로 감싸주면 됨

 

 

 

변수처럼 쓰는법 

(근데 나는 person 이거 비어서 나오던데...아무것도 안넣어서 그런거임?)

 

 

 

 

 

 

아까 readPERSON

이런 식으로 메모리..사용..

램 사용

필요한 만큼 메모리를 할당받아서 거기에 이름붙여서 사용하고 있ㅇㅁ

사용할때는 달러 표시 붙여서 메모리 주소에 있는값을 출력하도록하는 문법임...음 뭔소리인지 모르겠니?

 

야야 이후에는 이것좀 보자 야

https://judo0179.tistory.com/114

 

Shell Script 변수

본 문서는 https://www.tutorialspoint.com/ 에서 제공하는 UNIX / LINUX 쉘 튜토리얼을 참고했다. Extended Shell Scripts 쉘 스크립트를 수행할 작업과 시기를 알려주는 필수 구성요소가 필요하다. 대부분의 쉘..

judo0179.tistory.com

 

 

 

읽기 전용으로 한 변수는 수정도 안되고 unset도 안됨요

 

 

 

변수 종류 이렇게 네가지 있음

쉘에서 지정한 모든 변수는 기본적으로 전역변수

지역변수 쓰고 싶으면 로컬이라는 키워드를 써야 지역변수가 됨

 

환경변수라는거는 쉘스크립터를 통해서 작성된 프로그램이

우리가 동작시켯을 때 잘되기 위해서 사용되는 변수

 

 

헤이 이거봐유

https://devpouch.tistory.com/125

 

[linux] 환경변수 설정, 확인 및 해제 명령어

리눅스 환경변수를 적용하기 위해서는 크게 일시적으로 적용하는 방법과 영구적으로 적용하는 방법으로 나뉜다. 아래 내용은 bash 쉘 기준으로 작성되었다. 리눅스 환경변수 일시 적용 $ export 환

devpouch.tistory.com

윈도우에서도 환경변수 설정하는거 있었자나

 

컴 피씨에 속성. 고급시스템설정

리눅스도 환경설정이 있다는거 ~~

 

 

 

 

 

 

변수의 값을 이런식으로 넣을 수 있을까?

 

 

이렇게 붙여야 값이 전달 된다

변수의 띄어쓰기 때뭉네 안됏어

 

 

 

 

연산자로 

 

 

 

명령어 안에 넣기

변수에다가 명령어 저장

어쩌구저쩌구 

ls -al 실행돼서 값들 나옴

 

728x90
728x90

커널kernel과 사용자간의 다리역할

사용자가 시스템에 로그인 시 각 사용자에게 설정된 쉘이 부여

 

쉘종류

쉘 확인하기 

echo $SHELL

대문자로 해야됨요

 

bash shell 예약 변수

 

리눅스 쉘은 

xterm에서 구동된다

bash shell프롬프트 구성

 

리눅스 환경에서는 사용자마다 다른 쉘을 지정할 수 있다

 

쉘확인해보기

echo $SHELL

cat /etc/shells

 

어떤 쉘이 쓰고있나 확인 etc 안에.

여기 있는 걸로 골라서 바꿔 쓸 수 있다는 뜻임

 

쉘 바꾸기

chsh  (체인지 쉘)

바꿀애를 저렇게 넣어주면 됨

현재는 bash를 쓰지만 

dash로 바꾸고 싶으면 

/bin/dash

 

창 껐다가 켜야 적용됨

다시 켜서

 

dash는 앞에 애들이 안보이는 쉘

 

다시 바꿔서 원래꺼 쓰자~~

 

 

 

에러 

su: failed to execute /bin/bash/: Not a directory

나도 해보는데 이상하게 하고 나서 

sudo su - 가 안됐음

 

bash로 바꾸긴 했는데 (지금보니까 입력한 /bin/bash는 문제가 없는데 이전에 잘못넣었나봄 )

이제 슈퍼모드로 쓸라고 했는데 안돼

su 안돼

 

해결어떻게 했냐

sudo vi /etc/passwd

들어가면 

안에 계정 잔뜩 보임

 

거기 보니까 루트에 bash옆에 슬래시 있었음

i로 수정모드로 슬래시 지워줌

 

 

그러니까 잘됨~~

 

 

쉘 여러 명령 사용

 

쉘 한주에 255자까지 가능 명령어.

복잡한 명령어를 만들어놓은걸

쉡스크립트 만들어 놓으면 반복해서 사용할수 있다

 

;

여러 명령어 쓸때 세미콜론; 으로 구분함

성공,실패와 관련없이 전부 실행

명령1; 명령2;

 

 

&&

 

실패하면 그 뒤 명령어는 실행하지 않음

 

 

 

 

 

 

728x90
728x90

근데 나 안열리던데.. 다시 해볼게

 

 

sudo su -

mkdir 디렉토리

 

cd 디렉토리 

들어가서 

npm -v

node -v

있는지 확인

npm init

설치 

 

 

 

 

만듦

 

 

ls -al

안에 보니 

package.json

잘 깔렸음 

express 깔아줘

vi server.js

해서 안에 내용 적어주고 

cat으로 확인

 

 

이렇게 적었음 

node로 실행

 

지금 작동되고 있는거 확인

 

중지하고 

ps -ef

로 지금 돌아가고 있는거 확인하는데 안뜨네 server.js가...

원래 이렇게 떠야함

 

 

 

 

 

 

죽였다가 

노드로 다시킨다는 거 같음

 

 

kill 할때 뒤에 숫자는 pid인거 알겠는데

-9는 뭘까??(찾아보니까 잘안나와서 모르겠는데 옵션인듯)

 

 

포트 설정해줘야함.

 

 

제어판

시스템 및 보안(보안 및 유지 관리)

윈도우 방화벽

고급설정

 

걍 방화벽 검색해서 고급설정으로 들어가는게 빠름,,

 

인바운드규칙

인바운드 규칙에 

오른쪽 새규칙 누르면

 

포트 3000 넣기

 

 

 

 

다음에

도메인 뭐시기는 3개다 체크된 상태로 넘어가

이름 설정하면 끝

 

 

이게 나랑 

같은 네트워크 공유하는 사람끼리 

확인할 수 있게 하는거래

 

 

내 아이피 주소

cmd창에서 

ipconfig

로 검색

 

ipv4주소 복붙해서

 

아이피주소:3000

하면 나옴

 

오 뜬다..ㅋㅋㅋㅋㅋㅋ

ㅋㅋㅋㅋ아까 계속 안됐던 이유는...

ip주소.3000 하고 있었음...

ip주소:3000 입니다 정신차려~ 

 

 

 

vi server.js

안에 수정해서 다시 해봄 된다.

사실 해볼때 수정사항이 반영이 안되는거임

 

이유는 이전에 한 node server.js가 죽지 않은게 여러 개 있어서 그랬음

 

다죽여

방금한거 까지 죽이고

다시 켜

(내가 이해한거 맞지?)

 

그러면 위에처럼 바뀐거 짠 켜짐

 

 

728x90
728x90
개념적고 밑에 내가 해본 거 적어보겠음.
tar 아카이브란 여러 파일과 디렉터리를 담고 있는 하나의 파일. 

아카이브를 만드는 건 여러 개의 파일을 묶어서 하나의 파일로..

압축안하고 걍 하나파일로 뭉쳐놓는거

 

 

옵션 c 는 create 새아카이브 만들기
v는 verbose 작업중인 파일이름표시해주는 옵션
f는 아카이브할 파일 이름을 지정     

//옵션여러개 사용시에 순서는 안 중요함

//cvf자체는 용량은 그대로. 용량줄여주고 싶으면 z

// 여기서 .tar.gz은 .tgz과 같은 의미로 사용된다 (그럼 줄여쓰면 안되나..?)

 

압축하기

tar cvf 아카이브이름.tar 압축할디렉토리

tar cvfz 아카이브이름.tar.bz2 압축할디렉토리

압축해체하기

tar xvf 아카이브이름.tar

tar xvfz 아카이브이름.tar.gz

tar xvfj 아카이브이름.tar.bz2

 

//압축해제옵션x (extract)

//압축하기와 마찬가지로 gzip로 압축된 파일을 해제하려면 z옵션추가, bzip2압축된파일은 j옵션추가해서 작업

 

 

원하는 파일만 골라서 압축하기

tar cvf 아카이브이름.tar *.pdf

//피디에프애들만 압축하겠다~~

원하는 애들만 압축해체하기

tar xvf 아카이브이름.tar --wildcards '*.pdf'

 

 

특정파일을 제외하고 아카이브 만들기

tar -cvf 아카이브이름.tar 압축할디렉토리 --exclude='필요없는파일' --exclude="또는디렉토리이름'

//나는 이거해볼때 필요없는 파일까지만 해서 제외해서 해봄. 뒤에 다중으로 제외할 애들 추가할 수 있다는 거같음 

 

---

 

참고로 해볼때 디렉토리 안에 아무것도 없이 했더니

bz2압축풀 때 bz2파일 아니라고 xvfj 안됐음 xvf는 됐지만

 

 

먼저 파일들 담을 디렉토리(폴더)를 만들었음

mkdir 폴더명

만든 디렉토리 들어가서 

cd selftest/

(cd / 이렇게 해서 계속안됐음..)

 

압축해볼 텍스트파일, pdf파일 여러개 만듦

touch

밖으로 나와서 selftests로 이름지어서 압축했음 

결과

selftest 디렉토리 들어가서  pdf끼리 압축해봤음

이제 부분압축해제 해보려고 

원래 pdf파일들 먼저 삭제해줌 

헷갈리게 selftest_pdf를 삭제하지 않았구나

tar xvf selftest_pdf2.tar --wildcards '*pdf'

로 pdf압축해제됨 

 

흠...잘안되는거같다

제외하고 싶은 애가 제외안되는 듯

 

 

tar tvf newselftest.tar

얘가 아카이브 내용볼수있다길래 해봤는데 아무것도 안나옴

728x90
728x90

curl은 커맨드라인에서 url형태의 리소스를 요청/응답할 수 있는 도구다

전체 메뉴얼은 커맨드 라인에서 

man curl을 입력해서 볼 수 있음   

// curl사이트의 문서페이지 여기서도 확인가능 http://curl.haxx.se/docs/manpage.html

 

 

1. 응답을 파일에 쓰기

curl http://example.com/resource > foo.txt

옵션없이 호출하는 curl커맨드는 표준 출력으로 응답을 출력하는데 

위와 같이 출력을 리다이렉트해서 파일에 쓸 수 있다

 

수업시간에 말에 의하면,

이 명령어를 써서 나오는 결과물을 이 foo에 저장한다는 거

하이푼?과 비슷.하이픈은 결과값이 전달되는 거고 얘는 파일형태로 전달되는거 (하이픈이 그(-)하이픈이냐? )

 

2. 파일명으로 저장하기

curl -o foo.txt http://example.com/foo.txt

작은 영문o

-o옵션으로 리소스의 파일명을 지정해 다운할 수 있다.

curl -O http://example.com/foo.txt

대문자경우 리소스 파일명 그대로 사용

 

3.여러 파일 다운로드 받기

curl -O http://example.com/foo[0-9].txt

foo0부터 foo9까지 텍스트파일 다운

curl -O http://example.com/foo-[a-z][0-9].txt

대괄호 []는 여러 번 조합할 수 있고, 위 코드는 foo-a0.txt 부터 foo-z9.txt 까지의 파일을 다운로드 받는다.

 curl -O http://example.com/{foo,bar,baz}.txt
중괄호{}를 써서 위와 같이 호출할 수도 있고, foo.txt, bar.txt, baz.txt 를 다운로드 받는다.
파일 이름 여러 개 지정해서 다운 받는 것임
 
근데 이 3번째꺼 중괄호로 여러 개 쓰는 게 안됐음 
여러 개를 for문으로 다운 방법도 있음

  files="foo bar baz"
  for name in files
     > do curl -O "http://example.com/${name}.txt"
     > done


     -> 하지만 이렇게 하면 files.txt만 받아지게 되고, for name in foo bar baz 다음에 do done을 하면 세개가 저장됨.
     -> 근데 for name in $files 라고 하면 변수 설정이 먹혀서 잘 작동됨.

(for문 참고 :https://ansan-survivor.tistory.com/541)

 

 

이렇게 하면 됨

 

 
 
아니면 다른 방법 (이건 하다 말았지만)
vi 이건 있으면 수정하게 만들거나 없으면 새로 만드는 거임
cat 내용보여주기 
밑에 똑같이 for문 써주고
이거 쓰고 (참고로 위에 고친것처럼 고쳐주고)
esc
:wq
하고 실행 ./test_download.sh
했는데 안됨
권한주자
초록색으로 변함 실행고우

 

728x90
728x90

wget

인터넷에서 파일을 받는 가장 좋은 방법은 

인터넷에서 단일 파일 받아 현재 디렉토리에 저장하는 방법

여러 복잡한 다운로드 상황 거의 다 제어 가능

 

단일 파일 다운

wget 다운로드링크

 

다른 이름으로 저장하기 

>이름 지정안하면 마지막 슬레시가 이름으로 저장됨

>영어 대문자 오야~

wget -O 지정할이름 링크

 

다운로드 속도 지정

wget --limit-rate=속도 다운링크

 

wget –limit-rate=200k DOWNLOAD-URL

 

이어받기

wget -c 다운링크 

 

백그라운드에서 다운로드하기

대용량파일 받을 때 사용하는 옵션

wget -b http://www.openss7.org/repos/tarballs/strx25-0.9.2.1.tar.bz2
Continuing in background, pid 29401.
Output will be written to ‘wget-log’.

백에서 하고 있음

ps -ef는 프로세스 확인하는거 참고로 소문자임

 

아까 백그라운드 뭐시기 깐거 wget-log로 깔렸음

ls-al로 확인해봄

cat wget-log 로 치니까 나옴

728x90
728x90

둘다 웹서버로부터 컨텐츠를 가져오는 linux커맨드임

 

공통점

-http,https,ftp프로토콜을 통해 컨텐츠를 다운로드하는 커맨드라인툴임

-http post request를 지원함( 즉 웹사이트로 데이터 전송할 수 있음

-쿠키 지원

 

차이점

wget 

-간단, 직관적- 라이브러리 별도로 지원하지 않거든

-재귀적으로 다운로드 즉,페이지에 있는 모든 내용이나 ftp디렉터리에 있는 모든 파일들을 한 번에 그대로 복사해옴

curl

-라이브러리로 더 강력한 기능 추가하고 사용할 수 있음

-양방향임(wget은 일반 http post request만 지원함

-ssl 지원함

-gzip 압축 및 해지를 지원함 

- stdin 또는 stdout 의 pipe 를 이용하는 전통적인 unix 스타일의 방식도 지원함 (뭔소리인지 모르겠음)

-스탠다드 인 스탠다드 아웃.

유닉스 스타일의 방식을 지원하기도 하고. 컬은 양방향으로 통신, 지원가능함

이외 다른 기능필요할때는 이거

 

출처요:

https://wooono.tistory.com/279

 

 

 

wget

인터넷에서 파일을 받는 가장 좋은 방법은 

인터넷에서 단일 파일 받아 현재 디렉토리에 저장하는 방법

여러 복잡한 다운로드 상황 거의 다 제어 가능

wget 다운로드링크

728x90
728x90

오늘도 감사한 블로그선생님들

https://gamsungcoding.tistory.com/entry/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4Linux-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0

 

[Linux] 리눅스(Linux) 패키지 관리하기

이번 포스팅에서는 리눅스에서 패키지 관리(Package Management) 방법에 대해서 알아보도록 하자. 먼저 패키지 관리란 새로운 소프트웨어를 설치, 업데이트, 삭제하는 일을 말한다. 소프트웨어는 소

gamsungcoding.tistory.com

 

 

패키지 관리(새로운 소프트웨어를 설치, 업데이트,삭제하는 일 의미함) 방법

배포형태 소스코드의 형태
-하나의 아카이브 파일, 집파일 같은 거
-리눅스는 tar이라는 확장자 많이 씀 이런 거로 배포
바이너리 패키지 형태
-버전성과 의존성 같은 메타정보까지 포함되어있는 거

리눅스 배포 판에 따라 서로 다른 패키지 형식을 지원한다

-Debian 계열

-Redbian 계열

-openSUSE 계열

 

 

 
패키지는 저장소(repository)에 저장되어 있으며, HTTP 혹은 FTP 서버를 통해 다운로드 할 수 있다. 하나의 패키지가 다른 패키지나 공유 라이브러리 등을 필요로 하는 관계를 패키지 간의 의존성(dependency)라고 부른다. 의존성을 해결하는 기능을 제공하는 것이 리눅스의 패키지 관리 시스템의 주요 역할이다.

Ubuntu에서는 /var/cache/apt/archives 디렉터리에 다양한 .deb 파일들이 보관되어 있다. 이러한 패키지를 관리하기 위해선 패키지 관리 도구를 사용하는데, 일반적으로 다음 두 유형의 패키지 관리 도구가 사용된다
 저수준/고수준(의존성 해결) 패키지 관리 도구

 

  저수준 고수준
-Debian 계열 dpkg
- .deb패키지의 설치와 삭제 담당
apt-get/aptitude
-Redbian 계열 rpm yum
-openSUSE 계열
rpm zypper

 

dpkg 사용법

dpkg --help

dpkg -i 설치패키지명.deb  //패키지 설치

dpkg -l //소문자 엘l 써서 설치된 패키지 나열

dpkg -l 설치패키지명 //설치됐는지 확인 

dpkg -r 설치된패키지 //삭제

 

////수업시간에 minicom깔았다가 삭제해보기 한거///

sudo apt-get -d install minicom
cd /var/cache/apt/archives/
dpkg -i minicom_2.7.1-1.1_amd64.deb
dpkg -l
dpkg -r minicom
 sudo dpkg -P minicom 완전삭제

 

apt-get / apt-cache의 경우 패키지 repository는 /etc/apt/sources.list 에 명시되어 있다

test@ubuntu:~$ sudo cat /etc/apt/sources.list

/etc/apt/sources.list 파일에 명시된 패키지는 앞에서부터 순서대로 패키지 유형(deb 혹은 deb-src), 저장소 URL, Debian 버전 정보, 카테고리를 명시한다. 패키지 repository 리스트의 업데이트는 다음 명령을 통해 수행할 수 있다

$ sudo apt-get update
or
$ sudo apt update

 

728x90

+ Recent posts