728x90

오늘 로컬에서 원격 저장소로 파일을 하나 옮기려고 하는데 scp permission denied오류 때문에

리눅스 쉘에 명령어를 바꿔가며 수십 번 처보고, 구글에 검색도 해보고 얻은 결과입니다.

 

문제가 저와 다를 수 있지만 대부분 비슷한 답을 주니 먼저 시도해보고 다른 방법을 찾는 것도 좋으실 듯합니다.

 

일단 제 코드는 아래와 비슷합니다.

$ scp -P 9900 README.md user@192.168.xxx.xxx:/home/user/repo

해당하는 주소 home/user/repo에 9900번 포트를 이용해 README.md 파일을 옮기고 싶었으나

scp permission denied 오류가 발생했습니다.

 

해당 오류를 검색해보시면 크게 세 가지 방법을 찾으실 수 있는데요.

1. 옮기려는 파일의 권한이 잘 주어졌는지 확인해보세요. 

2. 원격 저장소의 포트 번호나 경로가 맞는지 확인해보세요.

3. 원격 저장소의 폴더 권한을 확인해보세요.

 

먼저 첫 번째 문제는 하위 디렉토리로 이동해서 ls -al 명령어를 치면 아래와 같은 결과를 얻을 수 있습니다.

그걸 보고 읽기, 쓰기 권한이 있는지 확인해보세요.

빨간색 부분이 권한이 있는지 없는지 나와있는 부분입니다. r은 읽기 w는 쓰기 x는 실행

저처럼 되어 있다면 문제없습니다.

 

두 번째의 포트번호는 원격 저장소에 설정하신 설정을 찾으셔야 하니 패스하고

경로 같은 경우는 상대 경로로 작성하면 된다는 이야기를 여러 스택오버플로우 페이지에서 볼 수 있었습니다.

$ scp -P 9900 README.md user@192.168.xxx.xxx:/home/user/repo

예를 들어 위와 같은 주소가 원격 저장소의 주소이고, /home/user가 홈 디렉토리인 경우에는 아래처럼 작성할 수 있습니다.

$ scp -P 9900 README.md user@192.168.xxx.xxx:~/repo

 

세 번째 문제는 로컬에서 원격 저장소에 파일을 보낼 때 원격 저장소의 디렉토리가 root 권한으로 설정되어있을 경우

해당 오류가 발생할 수 있습니다.

ls -al 명령어를 쳤을 때 파일을 받아오려는 원격 저장소의 디렉토리의 권한이 위와 같이 root로 되어있다면

권한을 변경하고 다시 시도해보세요.

$ sudo chown <사용자 계정> <디렉토리명>
$ sudo chown ymkim repo.git

위의 명령어로 사용자 계정으로 권한을 바꿀 수 있습니다.

예를 들어 두 번째 명령어는 repo.git 폴더를 ymkim계정 권한으로 바꾸는 것입니다.

 

여담으로 위의 방법들이 안되시면 ssh 서비스가 켜져 있는지 확인해보세요.

$ service ssh status

혹은 Scp permission denied (publickey)의 문제이면 원격 저장소에 ssh 공개키 등록을 해주셔야 합니다.

728x90
728x90

spring에서 네이버 로그인 API를 사용하려고 시도하면서 회원정보를 VO객체에 담으려고 할 때 오류가 났다.

ObjectMapper를 사용해 readValue() 메서드를 사용했는데 response의 값이 string이 아니고 json형식이라 그렇듯 하다.

아래는 네이버 로그인 API에서 응답으로 주는 사용자 정보로 key값 안에 배열이 하나 더 있다.

{
"resultcode":"00",
"message":"success",
"response":
    {
        "id":value,
        "nickname": value,
        "age": value,
        "gender": value,
        "email": value,
        "mobile": value,
        "mobile_e164": value,
        "name": value,
        "birthday": value,
        "birthyear": value
        }
}

해결책은 두가지가 있다.

  1. response 안의 키값들을 멤버 변수로 하는 클래스를 생성하기
  2. response의 데이터 타입을 JsonNode로 바꾸기

첫 번째 방법은 클래스 안에 클래스를 생성하면 된다.

// VO class
public class NaverProfileVO {
	private String resultcode;
	private String message;
	private InnerNaverProfileVO response;
	
	public class InnerNaverProfileVO{
		private String email;
		private String nickname;
		private String profile_image;
		private String age;
		private String gender;
		private String id;
		private String name;
		private String birthday;
		private String birthyear;
		private String mobile;
    }
}
getter/setter
// vo 객체 안에 value 값을 담는 메서드
NaverProfileVO vo = new NaverProfileVO();

ObjectMapper mapper = new ObjectMapper();
vo = mapper.readValue(jason문자열, NaverProfileVO.class);

이렇게 하면 NaverProfileVO 객체 안에 값이 다 담긴다.

그러나 네이버 뿐만 아니라 카카오와 구글 로그인 api도 구현하려고 하다 보니

세 가지를 통합해서 vo를 생성하기 때문에 중복된 변수들이 있어 첫 번째 방법은 사용하기 힘들다.

그래서 두 번째 방법을 사용했다.

 

public class SnsProfileVO extends SnsVO {
	//kakao
	private String properties;
	private String kakao_account;
	private Long kakaoid;
	
	//naver
	private String resultcode;
	private String message;
	@JsonProperty
	private JsonNode response; 
	private String age;
	private String birthyear;
	private String mobile;
	private String id;
	
	//google
	private String aud;
	private String sub;
	
	//common
	private String name;
	private String nickname;
	private String email;
	private String gender;
	private String birthday;
	private String age_range;
}

response의 데이터 타입을 JsonNode로 바꾸고 @JsonProperty 어노테이션을 작성했다.

이상태로 매핑을 하면 response에 json 데이터를 담을 수 있다.

담은 데이터를 다시한번 매퍼로 읽으면 객체에 값을 담을 수 있다.

다른 방법들이 있긴 하지만 다른 방법들은 하나하나 값을 저장하는 방식이라

가장 코드를 적게 사용하는 방법을 찾다 보니 이 방법을 찾게 되었다.

 

SnsProfileVO snsProfile = new SnsProfileVO();
ObjectMapper mapper = new ObjectMapper();
snsProfile = mapper.readValue(json문자열, SnsProfileVO.class);
snsProfile = mapper.readValue(snsProfile.getResponse().toString(), SnsProfileVO.class);

 

 

728x90
728x90

DACON의 영화 리뷰 EDA를 따라가면서 워드 클라우드 시각화 연습을 하던 중에

이런 오류에 부딪혔습니다. font_path가 문제였는데 원인을 알아도 해결책은

검색해봐도 찾기가 쉽지 않더라구요.

 

간단하게 설명하면 기존의 Windows/Fonts 경로가 아니라 python이 깔려있는

폴더 내에 있는 fonts 폴더에 원하는 글꼴을 복사해 넣어준 다음 그걸 경로로 사용하니

원하는 결과를 얻을 수 있었습니다. 

 

빨간 박스에 fonts를 검색합니다. 

 

제 경우에는 이 폴더였는데 경로가 참 길죠;

이제 폴더를 클릭해 들어간다음 그곳에 원하는 폰트를 복사 붙여 넣기로 넣어주세요 

 

이걸 경로 복사해서 font_path에 붙여 넣어주면

결과가 잘 나옵니다!

728x90

+ Recent posts