Eu defini alguns locais adicionais para a variável de ambiente PATH
no meu ~/.bashrc
, para que eles sejam incluídos / originados em logins e scripts não interativos agendados com cron
.
Tenho notado que em um sistema o PATH
é modificado corretamente, mas nenhum dos scripts dentro dele será executado, apesar de a propriedade e as permissões serem definidas corretamente (até onde eu sei).
$ ls -l
total 756
-rw-r-xr-x 1 slackline slackline 300 Sep 6 07:35 backup
-rwxr-xr-x 1 slackline slackline 978 Dec 30 10:28 bbc_mpd
-rwxr-xr-x 1 slackline slackline 355483 Nov 29 07:31 get_iplayer
-rwxr-xr-x 1 slackline slackline 110 Sep 6 07:35 rsync.albums
-rwxr-xr-x 1 slackline slackline 114 Sep 6 07:35 rsync.climbing
-rwxr-xr-x 1 slackline slackline 108 Sep 6 07:35 rsync.films
-rwxr-xr-x 1 slackline slackline 125 Sep 6 07:35 rsync.mixes
-rwxr-xr-x 1 slackline slackline 117 Sep 6 07:35 rsync.pics
-rwxr-xr-x 1 slackline slackline 117 Sep 6 07:35 rsync.torrents
-rwxr-xr-x 1 slackline slackline 95 Sep 6 07:35 rsync.work
O conteúdo de um dos meus scripts, que sincroniza um diretório para meu NAS para fazer o backup:
$ cat ~/bin/rsync.work
#!/bin/bash
source ~/.keychain/$HOSTNAME-sh
/usr/bin/rsync -avz /mnt/work/* readynas:~/work/.
que falha ao ser executado quando chamado:
$ rsync.work
bash: /home/slackline/bin/rsync.work: Permission denied
mas funciona quando precedido por bash -x
:
$ bash -x /home/slackline/bin/rsync.work
+ source /home/slackline/.keychain/kimura-sh
++ SSH_AUTH_SOCK=/tmp/ssh-P3GL1A3Juwhe/agent.4209
++ export SSH_AUTH_SOCK
++ SSH_AGENT_PID=4210
++ export SSH_AGENT_PID
+ /usr/bin/rsync -avz /mnt/work/android /mnt/work/arch /mnt/work/classes /mnt/work/doc /mnt/work/linux /mnt/work/lost+found /mnt/work/nc151.tar /mnt/work/nc152now-11.rar /mnt/work/personal /mnt/work/ref /mnt/work/scharr 'readynas:~/work/.'
sending incremental file list
sent 1,176,907 bytes received 19,786 bytes 30,296.03 bytes/sec
total size is 27,852,538,230 speedup is 23,274.59
$ set -x ; ~/bin/rsync.work ; set +x
+ /home/slackline/bin/rsync.work
bash: /home/slackline/bin/rsync.work: Permission denied
+ set +x
$ set -x ; bash -x ~/bin/rsync.work ; set +x
+ bash -x /home/slackline/bin/rsync.work
+ source /home/slackline/.keychain/kimura-sh
++ SSH_AUTH_SOCK=/tmp/ssh-P3GL1A3Juwhe/agent.4209
++ export SSH_AUTH_SOCK
++ SSH_AGENT_PID=4210
++ export SSH_AGENT_PID
+ /usr/bin/rsync -avz /mnt/work/android /mnt/work/arch /mnt/work/classes /mnt/work/doc /mnt/work/linux /mnt/work/lost+found /mnt/work/nc151.tar /mnt/work/nc152now-11.rar /mnt/work/personal /mnt/work/ref /mnt/work/scharr 'readynas:~/work/.'
sending incremental file list
sent 1,174,755 bytes received 19,786 bytes 39,165.28 bytes/sec
total size is 27,852,538,230 speedup is 23,316.52
+ set +x
Meu ~/.bashrc
tem a seguinte linha.
$ grep PATH ~/.bashrc
# Additions to system PATH
PATH="/home/slackline/bin:$PATH:/usr/local/stata/:/usr/local/stattransfer/"
export PATH
E eu posso executar o comando rsync
na linha de comando (por isso não é um caso de permissão negada na conexão SSH).
$ /usr/bin/rsync -avz /mnt/work/* readynas:~/work/.
sending incremental file list
sent 1,176,723 bytes received 19,786 bytes 32,781.07 bytes/sec
total size is 27,852,538,230 speedup is 23,278.17
(Backup está obviamente atualizado). A versão do Bash instalada é:
$ eix -Ic bash
[I] app-admin/eselect-bashcomp (1.3.6@08/29/13): Manage contributed bash-completion scripts
[I] app-shells/bash (4.2_p45@08/16/13): The standard GNU Bourne again shell
[I] app-shells/bash-completion (2.1@08/28/13): Programmable Completion for bash
[I] app-shells/gentoo-bashcomp (20121024@08/28/13): Gentoo-specific bash command-line completions (emerge, ebuild, equery, repoman, layman, etc)
Found 4 matches.
As permissões no diretório (e sua estrutura) são:
$ ls -l ~/ | grep bin
drwxr-xr-x 2 slackline slackline 4096 Dec 30 10:29 bin
$ stat -c"%n (%U) %a" / /home /home/slackline /home/slackline/bin
/ (root) 755
/home (root) 755
/home/slackline (slackline) 755
/home/slackline/bin (slackline) 755
E um strace
mostra
$ strace rsync.work
strace: Can't stat 'rsync.work': No such file or directory
$ echo $PATH
/home/slackline/bin:~/bin:/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.8.2:/usr/games/bin:/usr/local/stata/:/usr/local/stattransfer/:/usr/local/stata/:/usr/local/stattransfer/
$ ls -l ~/bin/ | grep work
-rwxr-xr-x 1 slackline slackline 95 Sep 6 07:35 rsync.work
$ rsync.work
bash: /home/slackline/bin/rsync.work: Permission denied
Eu não posso descobrir o que está errado aqui e ficaria grato por quaisquer pensamentos / idéias sobre como solucionar isso.
EDIT: Arrumei as várias edições feitas em resposta a perguntas que esperamos ler com um pouco mais de coerência e tornar mais fácil seguir o que eu tentei e como isso se encaixa com a solução de Mark Plotnick.