0

スクリプトに問題があります。変数 X と Y には、IP アドレスの最後のオクテットが割り当てられ、正常に機能します。Z は X と Y を取り、値を新しい txt ファイルに入れることになっています。

X=$(ssh -i key.txt "$USER"@A.B.C.D "awk -F' ' '{print \$2}' /etc/openvpn/ccd/lastip.txt | awk -F'.' '{print \$4+4}'")
Y=$(ssh -i key.txt "$USER"@A.B.C.D "awk -F' ' '{print \$3}' /etc/openvpn/ccd/lastip.txt | awk -F'.' '{print \$4+4}'")
Z=$(ssh -i key.txt "$USER"@A.B.C.D "touch $NAME.txt | chmod 700 $NAME.txt mv $NAME.txt /etc/openvpn/ccd | echo -n "$X $Y" > /etc/openvpn/ccd/$NAME.txt")

許可が拒否されたというメッセージが表示され続けます:

mv: bash: /etc/openvpn/ccd/almost.txt: Permission denied
cannot move `almost.txt' to `/etc/openvpn/ccd/almost.txt': Permission denied

ディレクトリは存在し、その権限は問題ありません。$NAME.txt を目的のディレクトリに移動するにはどうすればよいですか?

編集: Z=$() がなくても、コマンドラインを使用しても、アクセス許可が拒否されたというエラーが表示されます

4

1 に答える 1

2

このビットにはいくつかの作業が必要です。

touch $NAME.txt | chmod 700 $NAME.txt mv $NAME.txt /etc/openvpn/ccd | echo -n "$X $Y" > /etc/openvpn/ccd/$NAME.txt

少なくとも、パイプをセミコロンに置き換え、スペースの 1 つも置き換える必要があります。

touch $NAME.txt; chmod 700 $NAME.txt; mv $NAME.txt /etc/openvpn/ccd; echo -n "$X $Y" > /etc/openvpn/ccd/$NAME.txt

あなたが実行したいことはもっともらしいとは思えません$NAME.txt。700 ではなく 600 のアクセス許可を使用する必要があります。

の前にセミコロンがなかったためmvchmodプログラムは filesmvのパーミッションを$NAME.txt2 回目に変更しようとし、/etc/openvpn/ccd.

として実行していない限りroot、書き込みはできないはずです/etc/openvpn/ccd。ただし、現在のディレクトリのアクセス許可は表示されていませんが、touch機能しているように見えるため、おそらくそれに書き込むことができます。また、私がこれを書いた時点では、アクセス許可は/etc/openvpn/ccd与えられていませんでしたが、以下を参照してください。


そして、John Kuglemanがコメントで指摘しているように、私が分析したコマンド文字列が二重引用符のセット内にある大きなコンテキストでは、二重引用符は"$X $Y"バックスラッシュでエスケープする必要があります。

Z=$(ssh -i key.txt "$USER"@A.B.C.D "touch $NAME.txt; chmod 700 $NAME.txt; mv $NAME.txt /etc/openvpn/ccd; echo -n \"$X $Y\" > /etc/openvpn/ccd/$NAME.txt")

「許可なし」エラーの原因

権限/etc/openvpn/ccdが次のとおりであるとします。

drwxr-xr-x 2 root root 4096 2013-01-16 15:01 /etc/openvpn/ccd

rootとして実行されておらず、ディレクトリへの書き込みが許可されていないと推測できます。sudoターゲット マシンで使用するためのアクセス許可を取得する必要がある場合があります。

于 2013-01-29T02:27:39.117 に答える