为什么这个tar命令在ssh调用中作为字符串传递时失败?

时间:2015-06-25 21:23:36

标签: bash ssh tar sudo

ssh user@server "sudo tar -czf - -C /path/To/Directory *.properties" | tar xzf -

失败并出现以下错误 -

  

tar:* .properties:无法统计:没有这样的文件或目录

     

tar:由于之前的错误而退出失败状态

如果我ssh到服务器然后在服务器上,而不是tar -czf -使用tar -czf abc.tgz并在最后删除管道命令,它可以正常工作,即压缩目录中的所有.properties文件?< / p>

我尝试过使用--wildcards参数和-P以及以* .properties结尾的完整路径,但它们也没有用。

1 个答案:

答案 0 :(得分:3)

远端的shell在执行package com.dcdeveloper.fihresults; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ProgressBar; import android.widget.Spinner; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; /** * Fragment contenente le partite del campionato,disposte in giornate * Use the {@link PagePartite#newInstance} factory method to * create an instance of this fragment. */ // In this case, the fragment displays simple text based on the page public class PagePartite extends Fragment implements AdapterView.OnItemSelectedListener{ /** View del frammento*/ protected View view; private int mPage; /**URL del WEB Service a cui effettuare richieste HTTP per ottenere i risultati delle partite*/ private String wsURL; /**ID del campionato scelto*/ private static int idcampionato; /**Layout che consente l'aggiornamento della pagina tramite swipe verticale*/ SwipeRefreshLayout mSwipeRefreshLayout; /**Barra di progresso mostrata quando c'e una attesa nel caricamento dei dati*/ ProgressBar progressBar; /**Spinner per scegliere la giornata del campionato di cui visualizzare le partite*/ Spinner spinner; /**RecyclerView contenente le Card delle partite*/ RecyclerView recyclerList; /**Giornata del campionato scelta*/ private int giornata; /** * Inizializza il fragment con il campionato scelto. * @param IDCampionato Il campionato scelto * @return Fragment il fragment PagePartite */ public static Fragment newInstance(int IDCampionato) { PagePartite fragment = new PagePartite(); idcampionato=IDCampionato; return fragment; } /** * Costruttore vuoto richiesto */ public PagePartite(){ //required empty public constructor } /** * Funzione che inizializza i dati del Fragment * @param savedInstanceState */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * Funzione che crea la grafica del Fragment definito nella funzione newIstance.Inizializza la RecyclerView con le View delle Card, lo SwipeRefreshLayout * @param inflater Layout utilizzato per creare la grafica * @param container Container del Fragment * @param savedInstanceState * @return View rappresentante il fragment */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //inflates the view inside ViewPager view = inflater.inflate(R.layout.fragment_partite, container, false); mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.partite_swipe_refresh_layout); mSwipeRefreshLayout.setColorSchemeResources(R.color.colore_sfondo_menu, R.color.indicator_color, R.color.colore_menu); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { refresh(); } }); giornata=1; spinner = (Spinner) view.findViewById(R.id.spinner); //adding recyclerList and setting its layout recyclerList = (RecyclerView) view.findViewById(R.id.cardList); recyclerList.setHasFixedSize(true); LinearLayoutManager layout = new LinearLayoutManager(view.getContext()); layout.setOrientation(LinearLayoutManager.VERTICAL); recyclerList.setLayoutManager(layout); getGiornate(); getPartite(); return view; } /** * Funzione che riceve i risultati delle partite dopo aver effettuato una Richiesta HTTP,e li formatta all'interno di Card */ public void getPartite(){ wsURL = "http://fihresults.altervista.org/WebServiceFihResults/service.php"; if(hasConnection(view.getContext())) { HTTPRequest http=new HTTPRequest() { @Override protected void onPreExecute() { mSwipeRefreshLayout.setRefreshing(true); super.onPreExecute(); } @Override protected String doInBackground(String... params) { return super.doInBackground(params); } @Override protected void onPostExecute(String result) { mSwipeRefreshLayout.setRefreshing(false); super.onPostExecute(result); Log.i("INFO getPartite", result); JSONArray dati = null; ArrayList partite = new ArrayList(); try { dati = new JSONArray(result); for(int i=0;i<dati.length();i++) { JSONObject jsonobject = dati.getJSONObject(i); partite.add(new Partita(jsonobject)); } } catch (JSONException e) { e.printStackTrace(); } CardAdapter cardadapt = new CardAdapter(0,partite); recyclerList.setAdapter(cardadapt); } }; http.execute(wsURL, "4", "mostraPartite", "IDCampionato", String.valueOf(idcampionato), "NumGiornata", String.valueOf(giornata)); } else Toast.makeText(view.getContext(),"Connessione Internet assente",Toast.LENGTH_LONG).show(); } /** * Funzione che effettua una richiesta HTTP per ricevere il numero di giornate del campionato,quindi inserisce tali dati all'interno dello Spinner */ public void getGiornate() { Log.i("INFO PagePartite", "ESEGUO getGiornate()"); wsURL = "http://fihresults.altervista.org/WebServiceFihResults/service.php"; if(hasConnection(view.getContext())) { HTTPRequest http=new HTTPRequest() { @Override protected void onPreExecute() { if(!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true); super.onPreExecute(); } @Override protected String doInBackground(String... params) { return super.doInBackground(params); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); Log.i("INFO getGiornate",result); int numgiornate; ArrayList<String> giornate = new ArrayList(); JSONArray dati = null; try { dati = new JSONArray(result); JSONObject jsonobject = dati.getJSONObject(0); numgiornate= jsonobject.getInt("NumGiornate"); for(int i=1;i<=numgiornate;i++) { String riga = "Giornata "+i; giornate.add(riga); } } catch (JSONException e) { e.printStackTrace(); } final ArrayAdapter<String> adapter = new ArrayAdapter<String>(view.getContext(), android.R.layout.simple_list_item_1,giornate); spinner.setAdapter(adapter); } }; http.execute(wsURL, "2", "getMaxGiornate", "IDCampionato", String.valueOf(idcampionato)); spinner.setOnItemSelectedListener(this); } else Toast.makeText(view.getContext(),"Connessione Internet assente",Toast.LENGTH_LONG).show(); } /** * Funzione che cambia i dati a seconda della giornata selezionata all'interno dello spinner * @param parent Parent dello Spinner * @param view View * @param position Posizione selezionata all'interno dello spinner * @param id */ @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { giornata=position+1; getPartite(); } /** * Funzione che effettua il refresh dei dati della pagina */ public void refresh(){ getGiornate(); getPartite(); } } 之前扩展package com.dcdeveloper.fihresults; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentStatePagerAdapter; import android.util.Log; import android.view.View; /** * Adapter per l'inserimento del frammento in un ViewPager. * Settato per contenere tre pagine, "Partite","Classifica" e "Statistiche" * Created by Dario on 06/06/2015. * */ public class MyFragmentPagerAdapter extends FragmentPagerAdapter { final int PAGE_COUNT = 3; private String tabTitles[] = new String[] { "Partite", "Classifica", "Statistiche" }; public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } protected int idcampionato=1; //default value @Override public int getCount() { return PAGE_COUNT; } /** * Funzione richiamata quando un Fragment non è inizializzato,come all'avvio dell'applicazione.Restituisce il Fragment creato. * @param position Posizione in cui creare il Fragment * @return Fragment appena creato ed inserito nell'Adapter */ @Override public Fragment getItem(int position) { Fragment fragment=null; Log.i("MyFragmentPagerAdapter "+(String)getPageTitle(position),Integer.toString(position)); switch(position) { //when created,cards will get the default value (idcampionato=1) case 0: fragment = PagePartite.newInstance(idcampionato); break; case 1: fragment = PageClassifica.newInstance(idcampionato); break; case 2: fragment = PageStatistiche.newInstance(idcampionato); break; } return fragment; } /** * Ritorna il titolo della pagina corrente * @param position posizione corrente * @return Charsequence che rappresenta il titolo */ @Override public CharSequence getPageTitle(int position) { // Generate title based on item position return tabTitles[position]; } } 主目录中的* .properties。我猜测user中没有匹配的文件。

您可能想要的更像是(假设tar可以访问目录)

~user

或者,使用user的{​​{1}}选项,并停止远程shell扩展参数:

ssh user@server 'cd /path/To/Directory && sudo tar -czf - *.properties' \
    | tar xzf -