특정 경로의 다른 Linux 서버에서 파일을 삭제하는 방법은 무엇입니까?

특정 경로의 다른 Linux 서버에서 파일을 삭제하는 방법은 무엇입니까?

이것은 내 스크립트입니다. 여기서는 사용자가 지정한 경로에 있는 파일을 나열하는 데 사용하고 있습니다. 서버에 로그인하지만 파일을 나열하지 않습니다. 누구든지 알 수 있습니까?

#! /bin/bash
echo "Please give correct path"
for HOST in $(cat servers.txt ) ; do
    ssha $HOST < List.sh
done

catlist.sh

#!/bin/bash
echo "Enter the path to list the files"
read $path
ls -lrt

답변1

문제는 stdin을 통해 스크립트를 전달하지만 스크립트 자체는 stdin에서 읽으려고 한다는 것입니다. stdin에서 전달되는 스크립트에 인수를 전달하려면 명령줄 인수를 사용하고, 여전히 필요한 경우 외부 루프의 stdin에서 읽은 인수를 사용하는 것이 좋습니다.

두 번째 문제는 호출 구문이 read잘못되었다는 것입니다. ( 없이 변수 이름이 필요합니다. ) 또한 에 $전달하려고 합니다 . 그렇지 않으면 입력에 백슬래시가 포함된 경우 불쾌하고 예상치 못한 일이 발생합니다.-rread

for i in $(cat servers.txt)세 번째 문제는 원하는 동안 그 일을 하고 있다는 것입니다 <servers.txt while read -r i. 이 작업은 한 줄씩 수행됩니다. for루프는 전체 파일을 메모리로 읽어 들일 뿐만 아니라(큰 파일의 경우 폭발할 수 있음) 개별 줄에 공백이 있으면 실패합니다.

답변2

여기에는 몇 가지 문제가 있다고 생각합니다. 그 중 하나는 원격 서버의 ssh 세션에서 사용자에게 메시지를 표시하려고 하지만 stdin을 통해 스크립트를 ssh 세션으로 리디렉션하기 때문에 할당된 터미널이 없고 사용자가 다음 작업을 수행할 기회가 많지 않다는 것입니다. 대답하다.

그런 다음 에서 읽고 있지만 stdin이는 실제로 스크립트의 나머지 부분을 포함하는 스트림이므로 사용자 입력이 아니라 실행하려는 줄에서 읽는 것입니다.

$path그런 다음 변수를 읽을 매개변수로 확장하려고 시도 하지만 $변수 이름만 제공하기 때문에 변수를 확장하면 안 됩니다(변수를 설정한 모든 위치에서와 마찬가지로). .

마지막으로, 명령에 경로를 사용하려고 시도해서는 안 됩니다 ls.

이 경우 스크립트를 실행하기 전에 사용자에게 메시지를 표시하는 것이 더 나을 수 있습니다. 그것은 다음과 같습니다:

while read -r host; do
    read -p "Enter the path to list the files: " path
    ssh $HOST ls -lrt $path
done < servers.txt

관련 정보